【发布时间】:2022-11-05 04:39:50
【问题描述】:
我正在使用 asyncio 子进程来执行子命令。我想查看长时间运行的过程并将内容同时保存到缓冲区以供以后使用。此外,我发现了这个相关问题 (Getting live output from asyncio subprocess),但它主要围绕 ssh 的用例。
asyncio 子流程文档有一个逐行读取输出的示例,这朝着我想要实现的方向发展。 (https://docs.python.org/3/library/asyncio-subprocess.html#examples)
import asyncio
import sys
async def get_date():
code = 'import datetime; print(datetime.datetime.now())'
# Create the subprocess; redirect the standard output
# into a pipe.
proc = await asyncio.create_subprocess_exec(
sys.executable, '-c', code,
stdout=asyncio.subprocess.PIPE)
# Read one line of output.
data = await proc.stdout.readline()
line = data.decode('ascii').rstrip()
# Wait for the subprocess exit.
await proc.wait()
return line
date = asyncio.run(get_date())
print(f"Current date: {date}")
我将此示例改编为以下内容:
async def subprocess_async(cmd, **kwargs):
cmd_list = shlex.split(cmd)
proc = await asyncio.create_subprocess_exec(
*cmd_list,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.STDOUT, **kwargs)
full_log = ""
while True:
buf = await proc.stdout.readline()
if not buf:
break
full_log += buf.decode()
print(f' {buf.decode().rstrip()}')
await proc.wait()
res = subprocess.CompletedProcess(cmd, proc.returncode, stdout=full_log.encode(), stderr=b'')
return res
这里的问题是,proc.returncode 值有时会变为None。我想,我有一个误解,proc.wait() 的工作原理以及何时可以安全地停止读取输出。如何使用 asyncio 子进程实现连续输出?
【问题讨论】:
-
你能发布一个
proc.returncode变成None的例子吗?
标签: python logging subprocess python-asyncio