【问题标题】:Get stream from piped subprocess in async with Python与 Python 异步从管道子进程获取流
【发布时间】:2020-03-21 21:53:39
【问题描述】:

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

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

我想使用subprocessasyncio 来运行它,让它在async 中运行。

所以一开始我想运行:

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

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

tshark -l -n -T json -r -

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

有没有直接的解决方案?

【问题讨论】:

    标签: python python-3.x subprocess python-asyncio


    【解决方案1】:

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

    【讨论】:

    • proc.communicate() 将尝试读取所有数据,而不是逐行流式传输。这对内存使用不利(想象一下,如果您希望子标准输出大于主 RAM)并且对性能不利(在子进程完成之前不会处理第一行)
    • @inetknght 当然,这真的取决于正在运行的命令。例如,communicate() 很好,如果该命令已经包含一些聚合并产生一个小的输出(例如 tail -n 1wc 等)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2016-09-01
    • 2013-07-11
    • 2014-12-05
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多