以异步方式从管道子流程中获取流

问题描述 投票:0回答:2

我想直接在Python中运行以下命令:

dumpcap -q -f http -i eth0 -w - | tshark -l -n -T json -r - | my_app.py

我想通过使用subprocessasyncioasync中运行它来运行它。

所以首先我想运行:

dumpcap -q -f http -i eth0 -w -

此命令的输出应通过管道传递到下一个命令,该命令应该/可以不同步运行:

tshark -l -n -T json -r -

此输出应通过管道传递给我可以使用的流。

是否有一个简单的解决方案?

python python-3.x subprocess python-asyncio
2个回答
0
投票

除了@ 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"

0
投票

是否有一个简单的解决方案?

子流程文档中的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)
© www.soinside.com 2019 - 2024. All rights reserved.