首页 > 后端开发 > Python教程 > 如何在 Python 中逐行流式传输子进程输出?

如何在 Python 中逐行流式传输子进程输出?

Linda Hamilton
发布: 2024-12-16 06:27:17
原创
417 人浏览过

How Can I Stream Subprocess Output Line by Line in Python?

来自 subprocess.communicate() 的流式输出

Python 的 subprocess.communicate() 函数对于捕获进程的标准输出非常有用。但是,它通常会立即返回所有输出。这对于长时间生成输出的流程来说可能会很不方便。为了解决这个问题,我们探索了一种以流式传输方式打印进程标准输出的每一行的技术。

解决方案

通过采用迭代机制,我们可以检索行标准输出一旦成为available:

from subprocess import Popen, PIPE

# Launch a process with buffering set to 1 byte
p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)

# Iterate over the stdout lines as they become available
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print(line, end='')

# Wait for the process to terminate
p.wait()
登录后复制

解释

  • iter(p.stdout.readline, b''):这将创建一个迭代器,连续从 p 读取行.stdout 以非阻塞方式。
  • end='':这确保了每一行都被打印而没有尾随换行符。
  • p.wait():一旦迭代器耗尽,此函数将等待进程完成后再继续。

附加说明

  • 对于 Python 2,需要 iter() 来解决预读问题bug。
  • 对于 Python 3,universal_newlines 选项会自动将 stdout 解码为文本。
  • 替代方法,例如 Pexpect 或无缓冲实用程序,也可用于强制无缓冲 stdout。

以上是如何在 Python 中逐行流式传输子进程输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板