ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Revision history [back]

This is possible, but I'm going to ask why you want to do this? It's quite rare for this to be necessary. Can you use a launch file to achieve the same thing, if so then I'd highly recommend you to use that option.

Any operating system command can be executed from python using the os.system("your system command") function. So you can use this to start a node the same way that you do manually from the command line:

os.system("rosrun <package_name> <node_name> <arguments. . .>")

Importantly though this command will block until the node has completed and shut down which is probably not what you want to happen. I'm guessing you want to start a node up, and then continue with the rest of your python code while this new node is also running.

To start a node in the background you'll need to use os.spawnv() to start the node and store it's process id so that your python code can kill this sub-process before it closes:

node_pid = os.spawnv(P_NOWAIT, "rosrun", ["<package_name>", "node_name>", "<arguments. . .>"])

# Some python code to execute while the new node is running

so.kill(node_pid, signal.SIGINT)

There is a danger that if your python node crashes then the node you started in the background will keep running and will still need to be killed manually. So I'd just emphasise if you can use launch files instead then use them and only manage the processes like this yourself if you can't possibly avoid it.

Hope this helps.