我正在使用python27 lib的子进程从另一个python文件(sample.py)运行一个大的python文件(execute.py)。
如果我在windows命令行中运行sample.py(有子进程语句),它正在正常运行并且可以很好地流式传输实时输出。
但是在python GUI控制台中,当我运行GUI python文件(具有相同的子进程语句)时,GUI窗口在一段时间后输出整体打印(不是流式传输)时没有响应几分钟。
以下是摘录:
cmdlist = ["python", "execute.py","name","xyz"]
proc = subprocess.Popen(cmdlist, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(proc.stdout.readline, ""):
self.output.write(line)
self.output.write("\n Finished process\n")
打了我一个星期,到目前为止找不到任何解决方案。
答案 0 :(得分:0)
在命令行中运行脚本时:输出将直接发送到终端。 Python GUI控制台(IDLE)基于tkinter工具包,因此在运行脚本时: 输出将发送到缓冲区。 GUI工具需要一些时间来显示要筛选的缓冲区。因此,使用命令行运行时显示输出的时间会更长。如果您的脚本打印太多,缓冲区将溢出然后"没有响应"发生。
答案 1 :(得分:0)
如果您希望他们转到外部(控制)流程,请不要设置stdout
或stderr
。
cmdlist = ["python", "execute.py","name","xyz"]
proc = subprocess.Popen(cmdlist)
# do other stuff here if you like
self.output.write(
"\n Finished process (%s)\n" % proc.wait() # wait until process has finished; process will stream to stdout/stderr while we wait
)
如果将stdout
或stderr
设置为subprocess.PIPE
,则当前(python)进程会创建一个 new 管道,通过该管道与子进程通信。基本上,您自己的进程将缓冲子进程'输出
即使你没有明确缓冲任何东西,python本身也会做一些缓冲。当您重定向stderr
并将其写入您自己的stdout
时,这尤其适用 - 默认情况下缓存stdout,而stderr则不会。许多程序也写入同一行并重置光标,因此proc.stdout.readline()
将缓冲,等待该行完成。
现在,如果您未设置stdout
和stderr
,则子流程将继承您的stdout
和stderr
。这意味着它可以将直接写入外部控制过程。