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

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

这个问题在这里已有答案:

我正在开发一个嵌入式应用程序,它使用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"}}

上述值继续显示在STDOUT上。

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

最初我想从subprocess.check_output开始。

我试过了:

import subprocess

if __name_ == "__main__":

     while True:
         value = subprocess.check_output(['actisense-serial -r /ttyUSB0',
                                           '|',
                                           'analyzer -json'],
                                        shell=True)
         print(value)

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

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

python python-3.x subprocess
1个回答
1
投票

当你像这样使用stdout时,你可以传递一个管道到stderrPopen

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管道读取。这将一直运行,直到子进程终止。

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