在 Python 中,子进程模块提供了一种与系统命令交互的强大方法。然而,在处理产生大量输出的嘈杂命令时,有效捕获此输出并逐行显示它可能具有挑战性。
一种常见的方法是在 proc.stdout 中使用 for 行迭代器读取子进程的输出。然而,正如问题所强调的,这种方法可能会导致缓冲,从而导致输出延迟显示。
为了克服这个缓冲问题,解决方案在于利用 proc.stdout 对象的 readline() 方法。此方法允许我们逐行读取子流程的输出(当它可用时)。以下是包含 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 or other operations on the line as needed print("test:", line.rstrip())
在这个修改后的脚本中,我们进入一个连续循环,使用 readline() 重复读取子进程的标准输出。只要有可用的输出,循环就会继续,并在收到时打印每一行。这确保了输出以非阻塞的方式显示,为用户提供实时更新。
需要注意的是,该解决方案仍然留有潜在的空间缓冲问题取决于子进程的配置。例如,如果子进程的输出被大量缓冲,一些延迟可能仍然是不可避免的。为了解决这个问题,可能需要调整子进程的缓冲设置或采用其他策略,例如手动刷新输出缓冲区。
以上是如何在 Python 中捕获子进程的非阻塞输出?的详细内容。更多信息请关注PHP中文网其他相关文章!