2017-03-22 40 views
0

我在嘗試讓子流程做我想做的事情時遇到了一些麻煩。我有一個需要輸入文件的測試工具。 testtool.exe -f並在命令提示符下運行時產生像這樣的輸出。使用Popen在一個流中輸出所有東西

12:30:46 INFO Output- Processing arguments 
12:30:46 INFO Output- Arguments ok 
12:30:46 INFO Output- Doing something 
12:30:46 INFO Output- More Stuff 
12:30:03 ERROR Output- Error found 
12:30:03 INFO Output- Finished 
12:30:03 INFO Output- Exiting 

,所以我試圖用子進程運行在Python的Python 3.4.3這個工具。例如...

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True).communicate()[0].decode('utf-8') 
for i in proc.splitlines(): 
    print("> {0}".format(i)) 

不幸的是,輸出不包含'ERROR'行。我想完全按照我從命令提示符得到它的輸出,因爲我需要對它進行額外的驗證。例如出現多少個錯誤行,它們出現在輸出中的哪個位置。因此,將ERROR和INFO行分成不同的流不適合我。

> 12:30:46 INFO Output- Processing arguments 
> 12:30:46 INFO Output- Arguments ok 
> 12:30:46 INFO Output- Doing something 
> 12:30:46 INFO Output- More Stuff 
> 12:30:03 INFO Output- Finished 
> 12:30:03 INFO Output- Exiting 

我也試過

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=STDOUT, shell=True).communicate()[0].decode('utf-8') 

這是我最新的輪迴..

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 
    proc_data = proc.communicate() 

    for i in proc_data[0].splitlines(): 
     print ("INFO> {0}".format(i)) 

    for i in proc_data[1].splitlines(): 
     print ("ERROR> {0}".format(i)) 

而且,從來沒有出現錯誤行。就像它在某處丟失一樣?

+0

爲什麼'shell = True' – marisbest2

+0

因爲我正在構建命令以在別處運行並將其作爲一個命令傳遞給子進程。我的印象是,如果我不想將命令分成可執行文件+參數,我應該使用shell = True。 – John

+0

我總是被告知使用shell = True通常不是要走的路。沒有它,它會起作用嗎? – marisbest2

回答

0

Got it!這是我建立我運行的命令的結果。命令將exe和args包含在一行中。

command = "testtool.exe -f <filename>" 
proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 

這個運行的工具,但由於某種原因沒有產生我期待的錯誤。當我重新格式化下面的代碼片段時,我得到了我期待的錯誤。

proc = subprocess.Popen([testtool.exe, -f <filename>], stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 
相關問題