这个问题在这里已有答案:
我正在开发一个嵌入式应用程序,它使用CANBOAT存储库中的一些预编译二进制文件。
有两个二进制文件可供使用:
actisense-serial
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信息可以在应用程序中进一步解析和使用?
当你像这样使用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
,而是使用了两个Popen
调用,并将第一个的stdout输入到第二个的stdin
中。
编辑:错过了问题的流媒体部分。更新,以便它将不断从stdout管道读取。这将一直运行,直到子进程终止。