使用 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"。
我需要保存一些来自不同时间模拟的图像文件。所以我的想法是打开一个子进程保存一些图像文件并关闭它。
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"。