首页 > 解决方案 > 使用 Popen 打开一个进程无法关闭它(需要在 cmd 中运行 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但它也没有工作......

标签: pythonpopenros

解决方案


你可能不需要shell=True这里,这是你的问题的原因。我怀疑当您在第二个片段中终止进程组时,shell 进程在您要运行的进程有机会启动之前被终止......

尝试将参数作为字符串列表传递(因此您不需要shell=True),稍等片刻,然后terminatePopen对象上使用。您不需要进程组,也不需要psutil杀死进程及其子进程,只需简单terminate()地处理进程对象就可以了。

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.terminate()

请注意,proc.terminate()尝试在proc.kill()刚刚杀死进程的地方优雅地退出(在 Un*x 系统下存在差异,而不是在 Windows 下)

另一个呼吁“shell=True除非在枪口下被迫使用,否则不要使用”。


推荐阅读