2013-08-17 28 views
0

我需要從終端得到的結果捕獲來自終端(外部處理)的結果

mask = "audio" 
a = os.system("ls -l | grep %s | awk '{ print $9 }'" % mask) 
print a # a = 0, that's the exit code 

#=> 
file1_audio 
file2_audio 
0 

這個命令只是打印結果到控制檯,而我想將它捕捉到一個變量。

+0

你在這裏想要做的事情也可以在純Python中完成。 – Keith

+0

@凱斯,這只是一個例子,我有一個更嚴肅的任務。 – Mataba

+0

然後,您可以使用[subprocess](http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline)模塊運行管道並讀取stdout。 – Keith

回答

4

使用subprocess模塊

import subprocess 

p = subprocess.Popen("ls -l | grep %s | awk '{ print $9 }'" % mask, 
    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = p.communicate() 

shell=True的管道由shell中運行是必需的,否則,你得到一個No such file or directory

在Python 2.7,你也可以使用

output = subprocess.check_output(
    "ls -l | grep %s | awk '{ print $9 }'" % mask 
    stderr=subprocess.STDOUT, 
    shell=True) 

但我發現它使用麻煩,因爲它拋出一個subprocess.CalledProcessError如果不是0,並捕獲標準輸出和標準錯誤,你需要將管道返回退出代碼將它們交錯,這使得它在許多情況下不可用。

+0

是否有任何方式獲得結果作爲數組或列表而不是字符串? – Mataba

+0

你有一個字符串,是不是夠好? stdout,stderr是一個字節流,而不是一個列表。如果你需要一個列表使用例如stdout.splitlines() –

+0

他只在這裏真的需要'check_output';沒有理由創建「Popen」並調用「溝通」,除非您也有輸入來發送它(或者需要在創建和通信等之間做其他事情)。 – abarnert