2013-03-29 28 views
1

因此,我正在編寫一個python腳本,在該腳本中我需要調用另一個在標準輸出中打印幾行的python腳本。我想將被調用腳本的輸出存儲在列表中,並在主腳本中處理它們。Python子流程:如何檢索標準輸出

一個簡單的方法是打印結果到一個文件(文件3)和讀取文件,這樣

subprocess.call("./vecdiff.py file1 file2 > file3") 

f = open("file3", "r") 

我怎樣才能重定向輸出直接進入我的主腳本一些列表?

+0

[Python中反向等效項]的可能重複項目(http://stackoverflow.com/questions/1410976/equivalent-of-backticks-in-python) –

回答

2

如下,重定向你的子進程管道的輸出和錯誤,那麼你可以使用「通訊()方法來獲得標準輸出以及您的孩子從PIPE過程中的狀態。 'PIPE'是父進程和子進程之間的管道。

from subprocess import Popen, PIPE 
p = Popen("./vecdiff.py file1 file2", stdout=PIPE, stderr=PIPE) 
output, errput = p.communicate() 
+0

謝謝,但我得到了一個錯誤: OSError:[Errno 2]沒有這樣的文件或目錄:'./vecdiff.py tr674.init.pdb'TR674TS049_1.pdb' –

+0

無法將參數傳遞給字符串eters嵌入,因爲默認shell是禁用的。嘗試傳遞'[「vecdiff.py」,「file1」,「file2」]或者,如果你堅持使用字符串,將'shell = True'作爲參數傳遞給'Popen'。前者是可取的。 – tomasz

+0

是的,它有一個小修正:shell = True –

1

如果您使用subprocess.Popen(),則可以使用communicate()保存輸出。例如:

proc = subprocess.Popen("./vecdiff.py file1 file2", stdout=subprocess.PIPE) 
output = proc.communicate() 
+2

您可能想要除去'> file3'部分,因爲您希望運行'vecdiff.py'的輸出直接轉到標準輸出而不是文件。 – Michael0x2a

+0

哈哈,我的壞。我只是複製粘貼他的命令。 –

+0

我試圖使用這種方法,但出現錯誤: proc = subprocess.Popen(「./ vecdiff.py tr {0} .init.pdb TR {0} TS049_1.pdb」.format(tid),stdout = subprocess.PIPE) 文件「/usr/lib/python3.2/subprocess.py」,第745行,在__init__中 restore_signals,start_new_session) 文件「/usr/lib/python3.2/subprocess.py」,行1361,在_execute_child 提高child_exception_type(errno_num,ERR_MSG) OSERROR:[錯誤2]沒有這樣的文件或目錄: './vecdiff.py tr674.init.pdb TR674TS049_1.pdb' –

0

輕鬆與plumbum完成:

from plumbum.cmd import python 
cmd = python['./vecdiff.py']['file1', 'file2'] 
for line in cmd().splitlines(): 
    print line 
3

簡單方法是調用subprocess.check_output它調用的過程和返回它的輸出(或引發非歸零碼異常事件,但你仍然可以通過異常對象訪問輸出)。它可以很容易地處理STDOUTSTDERR(默認情況下只有STDOUT)。從手動

例子:

>>> subprocess.check_output(["echo", "Hello World!"]) 
'Hello World!\n' 

如果你的進程產生大量的數據,你想處理它,而它的運行,你就必須打開管道並使用communicate中所描述其他答案。