Python subprocess.check_output,带管道

时间:2015-08-24 20:41:24

标签: python

我试图获得

的输出
dmesg | grep -i 'bios'

我试过这个:

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

,但我收到了错误。

如何获取完整的sdtoutput消息?

2 个答案:

答案 0 :(得分:3)

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 :(得分:2)

你可以使用Popen管道将一个进程的stdout传递给另一个进程的stdin,但你也用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')