2016-07-07 66 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

相關問題