2015-08-24 42 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')