2017-09-27 113 views
2

我具有被先導雖然標準輸入並提供輸出到stdoutPython的子&標準輸出 - 程序死鎖

否則用於在QProcess中運行它C++/Qt的程序的模擬程序效果很好。

做一個的Python程序下Linux上運行它效果很好,使用:

p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE) 

而且使用p.stdin.writep.stdout.readline,並p.wait

然而,下windows,程序運行並通過stdin獲取命令(這已通過調試子進程進行了驗證),但python程序在任何p.stdout.readlinep.wait處都出現死鎖。如果stdout=subprocess.PIPE參數被刪除,程序將運行,輸出將顯示在控制檯上,並且不會發生死鎖。

這聽起來熟悉從Python文檔的警告:

警告:這將使用標準輸出=管和/或標準錯誤= PIPE並且當死鎖子進程產生足夠的輸出到管道 這樣它就會阻止等待OS管道緩衝區接受更多的 數據。使用通信()來避免這種情況。

但是,我不能使用通信(),因爲程序協議不是單個命令和單個輸出,而是需要多個命令和答覆。

有沒有解決方法?

+0

您是否嘗試過使用'bufsize'增加緩衝區?它可能有幫助 – Vinny

回答

1

不確定它,但它看起來像一個緩衝的問題。在Linux上(如在大多數Unix或類Unix上),輸出到文件或管道的操作系統內部進行緩衝。這意味着在調用write之後,所有數據都被緩衝,但管道的另一端沒有任何數據可用,直到內部緩衝區已滿,數據被刷新或管道關閉。這就是爲什麼pty是發明的原因之一,並且而不是用管子對實現。

換句話說,驅動一個程序,你需要使用先前的輸出來知道你應該給管道輸入什麼,除非程序是專門爲它定製的,在讀取任何東西之前一直刷新它的輸出。它在一個真正的終端(tty或pty)上工作,因爲驅動程序會在任何讀取同一設備之前自動強制刷新輸出。

但它與您在問題中引用的文檔中描述的不同。

相關問題