我正在尝试使用python脚本和子进程模块捕获ROS命令产生的输出。我的代码运行一个循环,并尝试在每次迭代中从STDOUT数据管道读取该行,并进行打印。如果捕获到KeyboardInterrupt异常(Ctrl-C),它将杀死该进程。但是,在roscore,roslaunch或rosrun的情况下,此代码表现得很有趣。代码如下:
#!/usr/bin/env python
import subprocess
import shlex
if __name__ == "__main__":
args = shlex.split('roslaunch tutorial_pkg main.launch')
print (args)
out = subprocess.Popen(args,stdout = subprocess.PIPE)
while out.poll() is None:
try:
print (out.poll())
output = str((out.stdout.readline()).decode('utf-8'))
if len(output) == 0 and (out.poll() is not None):
break
else:
print (output)
except (KeyboardInterrupt, SystemExit):
out.terminate()
运行此代码时,启动节点或roscore附带的所有初始调试信息都不会打印。任何输出到STDOUT的特定节点(如上述启动文件启动的节点)都将被正常打印。但是,如果程序结束/我按Ctrl-C,则将立即打印调试信息的所有初始行(即使我的except块中没有打印命令)。有人可以解释为什么代码以这种方式表现和/或解决此问题的方法吗?