使用子进程进行实时输出
在尝试创建带有进度指示器的包装器脚本时,您遇到了一个挑战,其中包装器的输出尽管使用 subprocess.Popen 和 stdout=PIPE,程序还是被缓冲了。正如您所发现的,将 bufsize 设置为 1 或 0 或使用输出循环都无法解决该问题。
解决方案:使用 readline
幸运的是,我们偶然发现了一种解决方法:利用 stdout 管道的 readline 方法。与您最初使用的积极缓冲的 for 循环方法不同,使用 readline 增强的 while True 循环表现出所需的行为。
<br>while True:<br> line = p.stdout。 readline()<br> 如果不是行:break<br> ...<br>
潜在问题
此问题源自Python 中的已知 bug,追踪为问题 3907。异常缓冲的具体原因尚不清楚。
结论
通过利用 readline 方法,您可以实现通过子进程启动的程序的实时输出,无需诉诸过时或可能不安全的技术,如 exec*。此解决方法在 3.x 以上的 Python 版本中仍然有效,确保向前兼容性。
以上是Python中如何实现子进程的实时输出?的详细内容。更多信息请关注PHP中文网其他相关文章!