首页 > 后端开发 > Python教程 > 如何在Python中实现子进程的非阻塞逐行输出过滤?

如何在Python中实现子进程的非阻塞逐行输出过滤?

Mary-Kate Olsen
发布: 2024-12-10 14:09:10
原创
360 人浏览过

How Can I Achieve Non-Blocking Line-by-Line Output Filtering from Subprocesses in Python?

子进程的非阻塞输出过滤:逐行方法

在 Python 编程中,捕获和处理外部命令输出的能力至关重要。一种常见的场景涉及使用 subprocess 模块来执行命令并检索其输出。然而,当输出大量时,就会出现挑战,我们需要增量地过滤和显示它。

延迟输出的问题

考虑以下Python脚本,它调用一个生成大量输出的实用程序:

import time
i = 0
while True:
    print(hex(i)*512)
    i += 1
    time.sleep(0.5)
登录后复制

在我们的父进程中,我们尝试读取并过滤输出:

import subprocess
proc = subprocess.Popen(['python', 'fake_utility.py'], stdout=subprocess.PIPE)
for line in proc.stdout:
    # perform filtering logic
    print("test:", line.rstrip())
登录后复制

最初,我们的期望是该实用程序的输出将在可用时逐行显示。然而,这并没有发生;相反,只有在产生大量数据后才会显示输出。

迭代器效率低下

这种延迟的原因在于在 proc.stdout 上使用 for 循环。这会在迭代处理之前将整个输出隐式读取到内存中。为了解决这个问题,我们可以采用一种更有效的方法:使用 readline()。

import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
while True:
  line = proc.stdout.readline()
  if not line:
    break
  # perform filtering logic
  print "test:", line.rstrip()
登录后复制

这种方法使我们能够在输出可用时逐行读取它,消除了延迟并提供了更高效的方法。响应式过滤进程。

结论

过滤子进程的输出可能是 Python 中的一项常见任务。通过了解 I/O 缓冲的细微差别并采用 readline() 等高效技术,开发人员可以实现非阻塞过滤器,以增量方式处理和显示数据,从而增强应用程序的响应能力。

以上是如何在Python中实现子进程的非阻塞逐行输出过滤?的详细内容。更多信息请关注PHP中文网其他相关文章!

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