2015-07-03 98 views
1

也許我需要的是對STDOUT是什麼的一般解釋,但這是我的問題。我需要在python中的一堆文件對中運行shell腳本,並解析輸出。如果我運行:從Popen捕獲輸出

from itertools import combinations 
from subprocess import Popen 

for pair in combinations(all_ssu, 2): 
    Popen(
     ['blastn', 
     '-query', 'tmp/{0}.fna'.format(pair[0]), 
     '-subject', 'tmp/{0}.fna'.format(pair[1]), 
     '-outfmt', '6 qseqid sseqid pident' 
     ], 
    ) 

...這似乎工作大(注:all_ssu是文件名實質上的列表)。 shell打印出一串我想要比較的數據。那麼,如何將打印的數據打印到列表或數據框中,以便我可以使用它?

環視文檔和這裏其他一些問題之後,它看起來像stdout標誌是尋找一個文件對象,所以我嘗試:

from itertools import combinations 
from subprocess import Popen 
for pair in combinations(all_ssu, 2): 
    out_file = open('tmp.txt', 'rw') 
    Popen(
     ['blastn', 
     '-query', 'tmp/{0}.fna'.format(pair[0]), 
     '-subject', 'tmp/{0}.fna'.format(pair[1]), 
     '-outfmt', '6 qseqid sseqid pident' 
     ], 
     stdout=out_file 
    ) 
    for line in out_file.readlines(): 
     print line 
    out_file.close() 

,這也似乎工作,但我創建那個我不需要的臨時文件。我試圖設置一個變量capturedNone,然後把stdout=captured,但在這種情況下,它只是將captured設置爲0.我也試過out = Popen(...)沒有stdout標誌,但再次,out只是int(0)。我也嘗試玩PIPE,但無法做到正面或反面。

所以問題是:我如何直接從Popen捕獲輸出?

+1

當您使用'PIPE'時,使用'Popen.communicate'從管道中讀取。 Python在線文檔確實有很好的例子。 –

回答

2

試試這個:

from itertools import combinations 
from subprocess import Popen, PIPE 
for pair in combinations(all_ssu, 2): 
    out = Popen(
     ['blastn', 
     '-query', 'tmp/{0}.fna'.format(pair[0]), 
     '-subject', 'tmp/{0}.fna'.format(pair[1]), 
     '-outfmt', '6 qseqid sseqid pident' 
     ], 
     stdout=PIPE 
    ).communicate[0] 
    print(out) 

How can I get terminal output in python?

stdout是公正的程序,這是該文件的標準輸出,其中,該程序將打印將被寫入任何東西。

如果你想在輸出作爲一個列表,那麼你可以在循環之前只是創建一個空的列表(l = []或東西),並在每次循環

3

從Python 2.7版的結尾做l.append(out)起,你可以使用 - subprocess.check_output

它將執行的命令的輸出返回爲字節字符串。

示例 -

>>> import subprocess 
>>> s = subprocess.check_output(["echo","Hello World!"], shell=True) 
>>> s 
b'"Hello World!"\r\n' 

我不得不用我的窗戶shell=True這個工作,但在Linux上,這可能是不需要的。

+0

請注意,'subprocess.check_output'在Python 2.7中是新增的。通常這不是問題,但要記住是很好的。 –

+0

謝謝,補充說,答案。 –