当cat |时,python subprocess.check_output不会返回grep组合

时间:2018-05-14 15:53:12

标签: python linux python-3.x raspberry-pi raspberry-pi3

我正在使用覆盆子pi并希望使用Python从cpuinfo中提取/proc/cpuinfo。这是我要执行的以下命令:

cat /proc/cpuinfo  | grep 'model name\|Hardware\|Serial' | uniq

当我直接在Raspberry pi终端上运行命令时,我得到以下输出:

model name      : ARMv7 Processor rev 4 (v7l)
Hardware        : BCM2835
Serial          : 0000000083a747d7

这也是我所期待的。我希望将其放入Python列表中,因此我使用subprocess.check_output()方法并考虑其格式化方式使用.split().splitlines()。但是使用subprocess.check_output()调用相同的命令我得不到我的期望。这是我在Python中运行的代码:

import subprocess
items = [s.split('\t: ') for s in subprocess.check_output(["cat /proc/cpuinfo  | grep 'model name\|Hardware\|Serial' | uniq "], shell=True).splitlines()]

我收到的错误如下:

TypeError: a bytes-like object is required, not 'str'

尝试调试问题: 1)在最后删除.splitlines()。即:

items = [s.split('\t: ') for s in subprocess.check_output(["cat /proc/cpuinfo  | grep 'model name\|Hardware\|Serial' | uniq "], shell=True)

现在输出错误是:

AttributeError: 'int' object has no attribute 'split'

2)删除.split时:

items = [s for s in subprocess.check_output(["cat /proc/cpuinfo  | grep 'model name\|Hardware\|Serial' | uniq "], shell=True)

输出items现在包含以下内容:

>>> items

[109,111,100,101,108,32,110,97,109,101,9,58,32,65,82,77,118,55,32,80,114,111,99, 101,115,115,111,114,32,114,101,118,32,52,32,40,118,55,108,41,10,72,97,114,100,119,97,114, 101,9,58,32,66,67,77,50,56,51,53,10,53,101,114,105,97,108,9,9,58,32,48,48,48, 48,48,48,48,48,56,51,97,55,52,55,100,55,10]

似乎grep的行为与我预期的不同。但是我无法解决究竟是什么问题。这些数字是多少?是grep返回的值吗?请帮忙解决问题。

由于

2 个答案:

答案 0 :(得分:0)

在Python3中,subprocess.check_output()返回bytes,需要在使用字符串函数之前将其解码为string。另一种选择是使用遗留subprocess.getoutput()函数。

以下代码为我完成了这项工作:

items = [s.split('\t: ') for s in subprocess.getoutput(["cat /proc/cpuinfo  | grep 'model name\|Hardware\|Serial' | uniq "]).splitlines()]

答案 1 :(得分:0)

与:比较:

items = dict(s.split('\t: ') for s in open('/proc/cpuinfo', 'r').read().splitlines() if s.startswith(('model name', 'Hardware', 'Serial')))