gpt4 book ai didi

python - 如何使用 asyncio 从子进程流式传输 stdout/stderr,并在之后获取其退出代码?

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:30 31 4
gpt4 key购买 nike

在 Windows 上的 Python 3.4 下,我需要流式传输子进程写入 stdout/stderr 的数据,即使用 asyncio 接收它的输出。 Python 3.4 中引入的框架。之后我还必须确定程序的退出代码。我该怎么做?

最佳答案

到目前为止我提出的解决方案使用 SubprocessProtocol接收来自子进程的输出,以及相关联的传输以获取进程的退出代码。我不知道这是否是最佳的。我的方法基于 answer to a similar question by J.F. Sebastian .

import asyncio
import contextlib
import os
import locale


class SubprocessProtocol(asyncio.SubprocessProtocol):
def pipe_data_received(self, fd, data):
if fd == 1:
name = 'stdout'
elif fd == 2:
name = 'stderr'
text = data.decode(locale.getpreferredencoding(False))
print('Received from {}: {}'.format(name, text.strip()))

def process_exited(self):
loop.stop()


if os.name == 'nt':
# On Windows, the ProactorEventLoop is necessary to listen on pipes
loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop)
else:
loop = asyncio.get_event_loop()
with contextlib.closing(loop):
# This will only connect to the process
transport = loop.run_until_complete(loop.subprocess_exec(
SubprocessProtocol, 'python', '-c', 'print(\'Hello async world!\')'))[0]
# Wait until process has finished
loop.run_forever()
print('Program exited with: {}'.format(transport.get_returncode()))

关于python - 如何使用 asyncio 从子进程流式传输 stdout/stderr,并在之后获取其退出代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24435987/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com