用Popen无法打开进程打开它(需要在cmd中运行Ros命令)

时间:2018-10-09 12:51:33

标签: python popen ros

我需要在不同的时间保存模拟中的一些图像文件。所以我的想法是打开一个子进程,保存一些图像文件并关闭它。

import subprocess

cmd = "rosrun pcl_ros pointcloud_to_pcd input:=camera/depth/points"
proc = subprocess.Popen(cmd, shell=True)

谈到结账时,我尝试了不同的事情:

import os
import signal
import subprocess

cmd = "rosrun pcl_ros pointcloud_to_pcd input:=camera/depth/points"
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                       shell=True, preexec_fn=os.setsid) 

os.killpg(os.getpgid(pro.pid), signal.SIGTERM)

命令未执行,因此对我不起作用。我也尝试过使用psutil的解决方案,但两者都不起作用...

1 个答案:

答案 0 :(得分:2)

您在这里可能不需要shell=True,这是造成问题的原因。我怀疑当您在第二个代码段中杀死进程组时,您要运行的进程之前会杀死Shell进程,从而有机会启动...

尝试将参数作为字符串列表传递(这样就不需要shell=True),稍等片刻,然后在kill对象上使用Popen。您不需要进程组,也不需要psutil来杀死进程及其子进程,只需在进程对象上使用简单的旧kill()就可以解决问题。

cmd = ["rosrun","pcl_ros","pointcloud_to_pcd","input:=camera/depth/points"]
proc = subprocess.Popen(cmd)
time.sleep(1)  # maybe needed to wait the process to do something useful
proc.kill()

编辑:似乎此“暗中射击”有效。另一个呼吁“除非被迫持枪,否则不要使用shell=True”。