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

Opens a process with Popen cant close it ( need to run Ros command in cmd)

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

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 的解决方案,但它也没有用...

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

尝试将参数作为字符串列表传递(因此您不需要 shell=True),稍等片刻,然后在 Popen 对象上使用 terminate。您不需要进程组,或者 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 下没有)

再次请求"do not use shell=True unless forced at gunpoint"。