python - 使用 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
但它也没有工作......
解决方案
你可能不需要shell=True
这里,这是你的问题的原因。我怀疑当您在第二个片段中终止进程组时,shell 进程在您要运行的进程有机会启动之前被终止......
尝试将参数作为字符串列表传递(因此您不需要shell=True
),稍等片刻,然后terminate
在Popen
对象上使用。您不需要进程组,也不需要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
除非在枪口下被迫使用,否则不要使用”。
推荐阅读
- ios - 我可以使用相同的上下文在 coredata 中保存两个实体吗?
- bash - 无法在我的 docker 容器中启动脚本
- angularjs - 如何将 JSON 和图像文件发送到服务器?
- javascript - (节点:31260)UnhandledPromiseRejectionWarning
- laravel - Laravel Image 干预在上传时出现 503 错误
- java - Android RecyclerView:如果不使用“setIsRecyclabe(false)”,则滚动期间内存使用量会增加
- swift - 从 Swift 中的字符串中删除 '
- python - Python:将开始日期和结束日期拆分为开始日期和结束日期之间的所有日期
- javascript - Rxjs 在继续之前等待先前的间隔请求执行
- python - Python中两个矩阵的并集