Search code examples
pythonpopenros

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


I need to save some image files from my simulation at different times. So my idea was to open a subprocess save some image files and close it .

import subprocess

cmd = "rosrun pcl_ros pointcloud_to_pcd input:=camera/depth/points"
proc = subprocess.Popen(cmd, shell=True)

When it comes to closing I tried different things:

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)

command did not execute , so it doesn't work for me. I also tried a solution with psutil and it didn't work neither...


Solution

  • you probably don't need shell=True here, which is the cause of your problems. I suspect that when you kill the process group in your second snippet, the shell process is killed before the process you want to run has a chance to start...

    Try to pass the parameters as a list of strings (so you don't need shell=True), wait a bit, and use terminate on the Popen object. You don't need process group, or psutil to kill the process & its children, just plain old terminate() on the process object does the trick.

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

    Note that proc.terminate() tries to exit gracefully where proc.kill() would have just killed the process (there's a difference under Un*x systems, not under Windows)

    Another plea for "do not use shell=True unless forced at gunpoint".