当前位置: 首页 > 面试题库 >

如何使用asyncio从子进程中流式输出stdout / stderr,然后获取其退出代码?

亢保赫
2023-03-14
问题内容

在Windows上的Python 3.4下,我需要使用Python
3.4中引入的asyncio框架流式传输子进程写入stdout
/ stderr的数据,即在发生时接收其输出。之后,我还必须确定程序的退出代码。我怎样才能做到这一点?


问题答案:

到目前为止,我想出的解决方案使用SubprocessProtocol来接收子进程的输出,并使用关联的传输来获取该进程的退出代码。我不知道这是否是最佳选择。我的方法基于JF
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的模块和方法时,如何检索退出代码? 相关代码: 我应该以其他方式这样做吗? 问题答案: 完成后将设置属性(*)。这是相关的文档部分: 所以您可以做(我没有测试过,但是应该可以): (*)发生这种情况的原因是它的实现方式:设置线程以读取子流后,它仅调用。

  • 问题内容: 因此,我注意到在等待命令完成之后再继续执行python脚本时,除了使用之外,我无法获取标准输出。是否有其他替代函数调用会等到完成?(我也尝试过) 注意:我正试图避免打电话 我的输出: 注意:我正在尝试与此。 问题答案: 我正在使用以下构造,尽管您可能要避免使用。这将为您提供任何命令的输出和错误消息,以及错误代码:

  • 问题内容: 我有以下脚本: 我从打来电话: 而且效果很好。 但是,当我这样做时: 口译员挂了。我究竟做错了什么?我希望能够多次读写另一个进程,以将一些任务传递给该进程。我需要做些什么? 编辑1 如果使用,则会得到以下信息: 编辑2 我试过冲洗: 和这里: 但它再次挂起。 问题答案: 我相信这里有两个问题在起作用: 1)您的父脚本调用,它将读取所有数据,直到文件结束。但是,您的子脚本会无限循环运行,

  • 问题内容: 我正在尝试运行可执行文件并使用;捕获其输出;但是,我似乎并没有获得全部输出。 手动打开时,它比原始exe文件少打印两行。 我尝试了一种具有相同结果的替代方法: 任何人都可以帮助我获取exe的完整数据吗? 正如塞巴斯蒂安的要求: 原始exe文件最后几行o / p: -Gdd:通用计数(1-1000) -Cdd:切割起始于(0-99)-Edd:切割终止于(1-100) 请在下面选择流文件编

  • 问题内容: 假设我有一个进程,它恰好产生了一个子进程。现在,当父进程出于某种原因(正常或异常,通过kill,^ C,断言失败或其他任何原因)退出时,我希望子进程死亡。如何正确地做到这一点? 问题答案: 子进程可以通过在syscall中指定选项来要求父进程去世时内核发出(或其他信号),如下所示: 有关详细信息,请参见。 编辑:这是仅Linux

  • 问题内容: 我正在尝试为命令行程序(svnadmin verify)编写包装脚本,该脚本将显示该操作的良好进度指示器。这要求我一看到包装程序的输出,就能够看到它的每一行。 我认为我只是使用, 来执行程序,然后读取其中的每一行并相应地对其进行操作。但是,当我运行以下代码时,输​​出似乎被缓冲在某处,导致它出现在两个块中,第1到332行,然后是333到439行(输出的最后一行) 在稍微了解一下子流程的