Getting python argparse to work with a launch file or python node

Hi everyone,

Here is a quick share about how to get argparse to work with a launch file. To start create a function in your launch file or python node file that contains the following.

import sys
import argparse

def get_args():
    """ Get arguments for individual tb3 deployment. """
    parser = argparse.ArgumentParser(
        description="TB3 Gesture Controller Launch File."
    )

    # Required arguments
    parser.add_argument("-n", "--number",
                        action="store",
                        type=int,
                        required=False,
                        help="Add TB3 node namespace number.",
                        default=0)

    return parser.parse_args(sys.argv[4:])

As you can see on the last line, you must index the sys.argv[4:] to the fourth value. If you don’t and just pass sys.argv, you get the following if you attempt to run ros2 launch pkg_name some_launch.launch.py -n 0:

['/opt/ros/dashing/bin/ros2', 'launch', 'pkg_name', 'some_launch.launch.py', '-n', '0']

The first 4 values passed to sys.argv are the original commands that you run. If you don’t want to import the sys library, you can use the rclpy library and replace the value in parser.parse_args() with:

    return parser.parse_args(rclpy.sys.argv[4:])

In your generate_launch_description() function, you can get your parsed launch or node arguments with:

def generate_launch_description():
    ...
    input_args = get_args()
    ...

Hope that helps!

2 Likes

very nice @zmk5 , thanks.

When you call help, however, the thread gets stuck. How to solve that issue?

1 Like

Hi @mhubii, would you mind making a more detailed question on https://answers.ros.org? Discourse is not meant for these kinds of questions. When you do make it send me a message here and I can answer your question there! :slight_smile:

1 Like