从长时间运行的进程中提取标准输出

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

免责声明:我见过很多类似的问题,但要么他们没有使用

asyncio
,要么他们似乎没有完全按照我的方式做。

我正在尝试使用以下命令获取长时间运行命令的输出(它实际上是一个注销到 stdout 的服务器):

    proc = await asyncio.create_subprocess_shell(
        "my_long_running_command",
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
        limit=10
    )

    stdout = ""
    try:
        stdout, stderr = await asyncio.wait_for(proc.communicate(), 2.0)
    except asyncio.exceptions.TimeoutError:
        pass
    print(stdout)

但我什么也没得到。如果我使用

ls
而不是
my_long_running_command
,它就可以工作。我看到的唯一区别是
ls
返回,而不是我的命令。

我正在使用

wait_for
因为文档说:

communicate() 和 wait() 方法没有超时参数:使用 wait_for() 函数;

我尝试了

limit=10
,希望它能帮助缓冲,但没有它。好像一点作用都没有

虽然我不太明白它们有什么不同,但我尝试了

asyncio.create_subprocess_shell
asyncio.create_subprocess_exec
都没有成功。

有没有办法在进程返回之前从进程中提取标准输出?

python subprocess python-asyncio
1个回答
0
投票

尝试使用

await proc.stdout.readline()
实时读取标准输出。例如:

import asyncio

async def main():
    proc = await asyncio.create_subprocess_exec(
        "top",                        # <--- some long running task
        stdout=asyncio.subprocess.PIPE,
    )

    line = await proc.stdout.readline()
    while line:
        print(line.decode())
        line = await proc.stdout.readline()


asyncio.run(main())
© www.soinside.com 2019 - 2024. All rights reserved.