从python的子进程连续调用shell命令并解析输出

2024-10-03 17:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个嵌入式应用程序,它使用CANBOAT存储库中的一些预编译二进制文件。在

有两个二进制文件可供使用:

  1. actisense-serial
  2. analyzer

在shell中,需要执行actisense -r /dev/ttyUSB0 | analyzer -json以从连接到USB端口的设备获取信息。上面提到的命令将JSON信息转储到STDOUT。在

样本输出:

{"timestamp":"2018-08-30T16:27:23.629Z","prio":2,"src":3,"dst":255,"pgn":128259,"description":"Speed","fields":{"SID":106,"Speed Water Referenced Type":"Paddle wheel"}}

{"timestamp":"2018-08-30T16:27:23.629Z","prio":2,"src":6,"dst":255,"pgn":128259,"description":"Speed","fields":{"SID":106,"Speed Water Referenced Type":"Paddle wheel"}}

将上述值保留在显示的标准值上。在

我希望在python脚本中使用上面提到的shell命令来获取JSON值,解析它们并将它们保存到数据库中。在

最初我想从subprocess.check_output开始。在

我试过了:

^{pr2}$

但是没有可用的输出。我不确定如何将STDOUT的输出路由到check_output。在

如何实现这一点,在这里来自shell命令的连续JSON信息可以被解析并在应用程序中进一步使用?在


Tags: 文件命令src信息jsonstdout二进制shell
1条回答
网友
1楼 · 发布于 2024-10-03 17:26:12

使用Popen时,可以将管道传入stdoutstderr

actisense_proc = subprocess.Popen(['actisense-serial', '-r', '/ttyUSB0'], 
                                  stdout=subprocess.PIPE)
analyzer_proc = subprocess.Popen(['analyzer', '-json'], stdin=actisense_proc.stdout,
                                 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while analyzer_proc.poll() is None:
    print(analyzer_proc.stdout.readline())

还要注意,我没有使用shell=True,而是使用了两个Popen调用,并通过管道将第一个调用的stdout导入第二个调用的stdin。在

编辑:错过了问题的流媒体部分。已更新,因此它将不断从stdout管道中读取。这将一直运行,直到子进程终止。在

相关问题 更多 >