2011-11-10 47 views
14

我使用subprocess.Popen或subprocess.call時有問題,當我使用它們來執行命令行時會產生大量的輸出,python腳本會掛起,但是什麼是奇怪的是,等待一段時間後,腳本處於掛起狀態時,我發現cmd命令所指定的工作已經完成,只有腳本被掛起。Python:subprocess.Popen和subprocess.call掛起

subprocess.call(cmd, shell = True) 
#OR 
subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True) 
# HANGS HERE 
print "show something after subprocess" 

請注意,最後一次打印永遠不會執行,但實際上cmd已被執行。

請注意,cmd與串口有關,所以當我拔出串口電纜時,一切都會好起來,並且最後一個打印狀態被執行。但是,當我使用終端時,即使插入串口,一切都很好,但只有在使用python腳本時纔會發生。

非常感謝

回答

12

根據Python文檔,subprocess.call運行命令,並等待其完成,所以它相當於subprocess.Popen隨後Popen.wait

但是,Popen.wait方法文檔明確警告緩衝區溢出問題,並建議使用Popen.communicate代替。因此,你要尋找的解決方案應該是這樣的:

import subprocess 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 
stdout, stderr = process.communicate() 
print "show something after subprocess" 
+1

如果您不使用'subprocess.PIPE',而OP不是'subprocess.call',則沒有問題。 – interjay

+1

這並不能解釋爲什麼'print'語句的輸出沒有顯示在父類中。 'Popen()'不會等待子進程,即使子進程被阻塞,試圖用滿緩衝區寫入管道。 – jfs

2

我不明白爲什麼你的第一個行不起作用 - 因爲沒有stdin/stdout/stderr重定向,沒有必要阻止。

第二個假定到框如果過程

  1. 通過stdin期望數據或
  2. 發送更多的數據到stdout比管可容納wothout被讀取。

但是,當你的子進程正確終止時,我看不到阻塞的原因。你確定它真的終止了嗎?