How to get CLI arguments in Python3?

In Python 3, you can get the Command Line Interface (CLI) parameters using the sys module. Consider the following example:

import sys

# The first parameter is always the name of the program itself
print("Program name:", sys.argv[0])

# The rest of the parameters are the command line arguments
print("CLI arguments:", sys.argv[1:])

sys.argv is a list containing the command-line arguments passed to the script. The first element of sys.argv is always the name of the script itself, and the rest of the elements are the actual arguments passed to the script.

You can access individual arguments using their index in the sys.argv list, starting from index 1. For example, sys.argv[1] will give you the first command-line argument, sys.argv[2] will give you the second argument, and so on. Under index 0 you can find the script name. Alternatively, you can splice this out.

Splicing the arguments #

Splicing the arguments using sys.argv[1:] will get you only the parameters without the script name. When you use the slice notation sys.argv[1:], it creates a new list that contains all the elements of the original sys.argv list, except for the first element (the script name).

In the context of command-line arguments, the first element of sys.argv is always the name of the program itself, and the rest of the elements are the actual arguments passed to the program.

For example, if you run the program myprogram.py with the command python myprogram.py arg1 arg2 arg3, then the sys.argv list would be:

['myprogram.py', 'arg1', 'arg2', 'arg3']

If you use the slice notation sys.argv[1:], then it creates a new list that contains all the elements of the sys.argv list, except for the first element ('myprogram.py'). The resulting list would be:

['arg1', 'arg2', 'arg3']

In other words, sys.argv[1:] is a way to extract only the command-line arguments from the sys.argv list, without including the name of the program itself. This can be useful when you want to process only the command-line arguments and not the name of the program.

If you still wonder how splicing works, you can check this answer on Stackoverflow.

Flags and Options #

Note that sys.argv includes all command-line arguments, including any flags or options that start with a hyphen (-) or double hyphen (--). If you want to parse these options in a more structured way, you can use a library like argparse.

Using argparse #

argparse is a powerful Python module for parsing command-line arguments and options. Here's a simple example:

import argparse

# Create the parser
parser = argparse.ArgumentParser(description='Example script to demonstrate argparse usage')

# Add some arguments
parser.add_argument('input_file', help='Input file name')
parser.add_argument('--output', '-o', help='Output file name')

# Parse the arguments
args = parser.parse_args()

# Access the parsed arguments
print('Input file:', args.input_file)
print('Output file:', args.output)

Here we've created an ArgumentParser object and added two arguments to it: input_file and output. The input_file argument is required, while the output argument is optional.

The help argument of the add_argument method is used to provide a brief description of the argument. The --output and -o arguments are equivalent. The -o option is the shorthand for the longer --output option.

Once the arguments have been defined, we call the parse_args method of the ArgumentParser object to parse the command-line arguments. The resulting args object contains the values of the parsed arguments.

We can access the values of the arguments using the attribute names that correspond to the argument names. For example, args.input_file gives the value of the input_file argument and args.output gives the value of the output argument.

Note that argparse automatically generates help messages based on the argument definitions, which can be accessed by running the script with the --help option.

🙏🙏🙏

Since you've made it this far, sharing this article on your favorite social media network would be highly appreciated 💖! For feedback, please ping me on Twitter.

Published