2013-09-23 29 views
0

我想讀取從我的python腳本以C++編寫的可執行文件(A)的輸出。我在Linux上工作。到目前爲止,我知道的唯一途徑是通過子庫python:讀取可執行文件的標準輸出,損壞的流

首先我想

p = Popen(['executable', '-arg_flag1', arg1 ...], stdout=PIPE, stdin=PIPE, stderr=STDOUT) 
print "reach here" 
stdout_output = p.communicate()[0] 
print stdout_output 
sys.stdin.read(1) 

這竟然掛了我的兩個可執行文件(用99%的CPU使用率)和我的腳本:S:S :S 此外,在這裏打印。

之後,我嘗試:

f = open ("out.txt", 'r+') 
command = 'executable -arg_flag1 arg1 ... ' 
subprocess.call(command, shell=True, stdout=f) 
f.seek(0) 
content = f.read() 

這個工作,但我得到其中一些字符在內容的末尾重複的輸出,甚至更多的價值比預期的產生:S

反正可能有人啓發我更合適的方式來做到這一點?

在此先感謝

回答

0

第一個解決方案是最好的。使用shell = True會比較慢,並且存在安全問題。

問題是Popen不等待進程完成,所以Python停止離開沒有stdout,stdin和stderr的進程。導致這個過程瘋狂。添加p.wait()應該可以做到!

此外,使用溝通是時間的損失。只要做stdout_output = p.stdout.read()。你必須檢查自己stdout_output是否包含任何東西,但是這比使用通訊()[0]更好。

+0

對不起,我忘記提及我在p.communicate後有一個sys.stdin.read(1),如編輯後的文章所示,所以python腳本也隨着C++可執行文件一起掛起。 無論如何,我嘗試添加p.wait(p.Popen之後,然後p.communicate之後),沒有運氣。 此外我應該提到「到達這裏」是打印的。 最後我試着p.stdout.read()而不是溝通,再次運氣不佳:( – chefarov

相關問題