代码之家  ›  专栏  ›  技术社区  ›  Shan-Desai askovpen

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

  •  0
  • Shan-Desai askovpen  · 技术社区  · 6 年前

    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 .

    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信息可以被解析并在应用程序中进一步使用?

    1 回复  |  直到 6 年前
        1
  •  1
  •   wholevinski    6 年前

    你可以把管子通到 stdout stderr 当你使用 Popen

    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 ,我用了两个 波本 呼叫并通过管道将第一个的stdout传输到 stdin 第二个。

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