2016-07-07 65 views
-1

我使用python27的子进程lib从另一个python文件(sample.py)运行一个大的python文件(execute.py)。Python子进程在命令行和GUI控制台展现不同的行为,同时流输出

如果我在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

在打印输出之前,GUI可能会将整个输出存储在缓冲区中。 Python GUI控制台究竟意味着什么? – KartikKannapur

+0

我的python图形用户界面附带控制台。我们可以看到任何运行的输出。我是否需要在子流程中为实时输出设置'bufsize'? – Nithya

+0

你使用的是什么python GUI? – MisterMiyagi

回答

0

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

+0

不错,那我该如何解决这个问题?任何想法?我需要像在Windows命令行中一样的方式。 – Nithya

+0

有没有解决办法? – Nithya

+0

对不起,我没有任何想法来解决这个问题。 –

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 
) 

如果设置stdoutstderrsubprocess.PIPE当前的(Python)的过程将创建一个新通过它与子进程进行通信。基本上,你自己的进程会缓冲子进程的输出。

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

现在,如果你不设置stdoutstderr,子进程将继承stdoutstderr。这意味着它可以直接将写入到外部控制过程。

+0

它抛出属性错误.' AttributeError:'NoneType'对象没有属性'readline''文件正在后台运行(线程) – Nithya

+0

@Nithya我的坏。当然,当不重定向'stdout'时不能执行'proc.stdout.redline',因为'proc.stdout'没有被设置。我已经修复了相应的部分。 – MisterMiyagi

+0

我还可以在'#do other stuff'部分使用for循环吗? – Nithya

相关问题