2015-08-24 81 views
1

我試圖讓的Python subprocess.check_output,與管道

dmesg | grep -i 'bios' 

輸出我已經試過這樣:

dmsg = subprocess.check_output("dmesg | grep -i 'bios'").decode('utf-8') 

,但我發現了一個錯誤。

如何獲取完整的sdtoutput消息?

+1

你收到了什麼錯誤?您通常必須將命令和參數作爲列表中的元素,而不是單個字符串。請參閱[文檔](https://docs.python.org/2/library/subprocess.html#subprocess.check_output) –

+1

像這樣它只能使用'shell = True' – mata

回答

2
import subprocess 

p1 = subprocess.Popen(['dmesg'], stdout=subprocess.PIPE) 

p2 = subprocess.Popen(['grep', '-i', 'bios'], stdin=p1.stdout, stdout=subprocess.PIPE) 

p1.stdout.close() 
out, err = p2.communicate() 

print(out) 
1

可以通過管道使用Popen路過一個人一個過程的標準輸出到另一個標準輸入,但你也解析與Python dmesg的,而不是運行兩個過程的輸出:

import subprocess 
dmsg = subprocess.check_output("dmesg",universal_newlines=True).splitlines() 
print([line for line in dmsg if "bios" in line.lower()]) 

如果你是試圖管道使用check_output你需要使用shell=True

import subprocess 
dmsg = subprocess.check_output("dmesg | grep -i 'bios'",shell=True).decode('utf-8')