使用 Python 的子进程很难获得过滤后的 dmesg 输出

问题描述 投票:0回答:1

我一直在尝试从 Python 脚本中的 dmesg 获取拔出 USB 设备的日志。在命令行中,我会输入:

dmesg | tail -100 | grep "USB disconnect"
并查看所需的输出。在脚本中,我一直在使用 subprocess.run 命令,但管道重定向似乎存在问题,因为如果我简单地使用“dmesg”作为 subprocess.run 参数,我确实会得到整个巨大的日志。这是一个示例尝试及其输出,以及对 subprocess.call 执行相同操作的尝试:

import subprocess

args = ["dmesg | tail -100 | grep \042USB disconnect\042"]
grep_rpt = str(subprocess.call(args[0x00], shell = True))
print(grep_rpt + ", " + str(len(grep_rpt)))
args = ["dmesg",  "|",  "tail",  "-100",  "|",  "grep",  "\042USB disconnect\042"]
shellCmd = subprocess.run(args, capture_output = True, text = True)
grep_rpt = str(shellCmd.stdout)
print(grep_rpt + ", " + str(len(grep_rpt)))

输出:

[ 4197.327275] usb 1-1.3: USB disconnect, device number 19
[ 4329.665928] usb 1-1.3: USB disconnect, device number 20
[ 4645.282024] usb 1-1.3: USB disconnect, device number 21
[ 4729.497491] usb 1-1.3: USB disconnect, device number 22
[ 4961.154086] usb 1-1.3: USB disconnect, device number 23
[ 5090.165051] usb 1-1.3: USB disconnect, device number 24
[ 5181.803769] usb 1-1.3: USB disconnect, device number 25
[ 5620.543437] usb 1-1.3: USB disconnect, device number 26
[ 5831.722098] usb 1-1.3: USB disconnect, device number 27
[ 7350.416575] usb 1-1.3: USB disconnect, device number 28
[ 7507.328715] usb 1-1.3: USB disconnect, device number 29
0, 1
, 0

这个输出有点欺骗性,因为设备列表是 subprocess.call 操作的结果,它总是会显示到屏幕上,但不会作为对象发送回来,因为正如你所看到的,我得到了“ 0" 作为字符串返回。我尝试执行

capture_output = True
来阻止此操作,但它似乎不是 call() 选项之一,即使它用于 run() 。您可以看到 run() 返回 None。再说一次,如果我只是在没有管道的情况下执行“dmesg”,一切都很好。我确实在 run() 的参数上尝试过
shlex
但没有帮助。我还成功地使用 run() 从 i2c 总线获取数据,因此我知道我正在正确处理多个参数的格式。我在这里缺少什么?

python linux subprocess dmesg
1个回答
0
投票

阅读其他一些线程后,我得到了正确的输出:

grep_rpt = subprocess.getoutput("dmesg | tail -100 | grep \042USB disconnect\042")

尽管奇怪的是 subprocess.check_output() 不起作用。 StackOverflow 上的其他讨论似乎表明要获取 |管道结果您必须多次调用子进程并将其中一个的输出作为下一个的输入。我希望这并不是真正发生的事情,因为我想让 dmesg 输出由内核而不是 Python 过滤。

© www.soinside.com 2019 - 2024. All rights reserved.