我需要在不同的时间保存模拟中的一些图像文件。所以我的想法是打开一个子进程,保存一些图像文件并关闭它。
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
的解决方案,但两者都不起作用...
答案 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
”。