我想直接在Python
中运行以下命令:
dumpcap -q -f http -i eth0 -w - | tshark -l -n -T json -r - | my_app.py
我想通过使用subprocess
和asyncio
在async
中运行它来运行它。
所以首先我想运行:
dumpcap -q -f http -i eth0 -w -
此命令的输出应通过管道传递到下一个命令,该命令应该/可以不同步运行:
tshark -l -n -T json -r -
此输出应通过管道传递给我可以使用的流。
是否有一个简单的解决方案?
除了@ user4815162342的答案,请注意,您可以简单地将完整的shell命令传递给create_subprocess_shell,并使用管道与子进程的两端进行通信:
示例:
proc = await asyncio.create_subprocess_shell(
"tr a-z A-Z | head -c -2 | tail -c +3",
stdin=asyncio.subprocess.PIPE,
stdout=asyncio.subprocess.PIPE,
)
stdout, _ = await proc.communicate(b"**hello**")
assert stdout == b"HELLO"
是否有一个简单的解决方案?
子流程文档中的example也应适用于asyncio子流程。例如(未测试):
async def process():
p1 = await asyncio.create_subprocess_shell(
"dumpcap -q -f http -i eth0 -w -", stdout=asyncio.subprocess.PIPE)
p2 = await asyncio.create_subprocess_shell(
"tshark -l -n -T json -r -",
stdin=p1.stdout, stdout=asyncio.subprocess.PIPE)
p1.stdout.close() # we no longer need it
while True:
line = await p2.stdout.readline()
if not line:
break
print(line)