【发布时间】:2019-02-26 19:00:43
【问题描述】:
我想从 python 脚本运行 Python 脚本(或任何可执行文件,以这种方式)并实时获取输出。我学习了很多教程,我当前的代码如下所示:
import subprocess
with open("test2", "w") as f:
f.write("""import time
print('start')
time.sleep(5)
print('done')""")
process = subprocess.Popen(['python3', "test2"], stdout=subprocess.PIPE)
while True:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
print(output.strip())
rc = process.poll()
为清楚起见,第一位只是创建将要运行的文件。
这段代码有两个问题:
它不会实时给出输出。它一直等到该过程完成。
一旦进程完成,它不会终止循环。
非常欢迎任何帮助。
编辑:感谢@JohnAnderson 解决了第一个问题:将if output == '' and process.poll() is not None: 替换为if output == b'' and process.poll() is not None:
【问题讨论】:
-
如果代码运行不正确,请查看我的最新编辑。
-
我想你想用
output做别的事?因为否则只需将stdout设置为None应该对您有用(默认情况下仍为行缓冲,可能非常取决于平台)。否则,您需要将stdout附加到一个线程,该线程在传递内容时消耗控制台输出存储和打印内容。 -
@OndrejK。是的,我想稍后在程序中使用
output。 -
在 Ubuntu 上,我得到实时输出。你在 Windows 上吗?另外,您需要将
if更改为if output == b'' and process.poll() is not None:,否则它永远不会是True。 -
问题不是你的输入,而是你缓冲的python子进程输出,将
-u添加到使用subprocess创建的python调用以关闭缓冲(['python3', '-u', 'test2']),你应该看到线条在“打印”时出现。默认行为是:stdout 到控制台 -> 行缓冲,stdout 到其他任何东西 -> 默认缓冲区(我认为你的情况是 4KB)。
标签: python python-3.x subprocess