在 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中文网其他相关文章!