免责声明:我见过很多类似的问题,但要么他们没有使用
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
都没有成功。
有没有办法在进程返回之前从进程中提取标准输出?
尝试使用
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())