流子输出时,Python子进程在命令行和GUI控制台中表现出不同的行为

时间:2016-07-07 06:45:24

标签: python python-2.x

我正在使用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")

打了我一个星期,到目前为止找不到任何解决方案。

2 个答案:

答案 0 :(得分:0)

在命令行中运行脚本时:输出将直接发送到终端。 Python GUI控制台(IDLE)基于tkinter工具包,因此在运行脚本时: 输出将发送到缓冲区。 GUI工具需要一些时间来显示要筛选的缓冲区。因此,使用命令行运行时显示输出的时间会更长。如果您的脚本打印太多,缓冲区将溢出然后"没有响应"发生。

答案 1 :(得分:0)

如果您希望他们转到外部(控制)流程,请不要设置stdoutstderr

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
)

如果将stdoutstderr设置为subprocess.PIPE,则当前(python)进程会创建一个 new 管道,通过该管道与子进程通信。基本上,您自己的进程将缓冲子进程'输出

即使你没有明确缓冲任何东西,python本身也会做一些缓冲。当您重定向stderr并将其写入您自己的stdout时,这尤其适用 - 默认情况下缓存stdout,而stderr则不会。许多程序也写入同一行并重置光标,因此proc.stdout.readline()将缓冲,等待该行完成。

现在,如果您未设置stdoutstderr,则子流程将继承您的stdoutstderr。这意味着它可以将直接写入外部控制过程。