Python Command Line Arguments – 3 Ways to Read/Parse

Python command line arguments are the parameters provided to the script while executing it. The command-line arguments are used to provide specific inputs to the program.


What is the benefit of Python Command Line Arguments?

Python command-line arguments help us to keep our program generic in nature. For example, we can write a program to process a CSV file. If we pass the CSV file name from the command-line, then our program will work for any CSV file. This will make our program loosely coupled and it will be easy to maintain it.

Another benefit of command-line arguments is the additional security that comes with it. Let’s say we have a program to save data into the database. If we store the database credentials in the script or some configuration file, it can be accessed and executed by anyone having access to the files. But, if the user/password is provided as a command-line argument, then it’s not present in the file system and our program is more secured.


How to Pass Command-line Arguments in Python?

If you are running the python script from the terminal, just pass the arguments after the script name. The arguments are separated with white space characters.

$ python script.py arg1 arg2 ... argN

Passing Command-line arguments in PyCharm

PyCharm is the most popular IDE for Python programming. If you want to pass command-line arguments to a python program, go to “Run > Edit Configurations” and set the Parameters value and save it.

Python Command Line Arguments PyCharm
Python Command Line Arguments PyCharm

How to Read Command-line arguments in Python Script?

There are three popular modules to read and parse command-line arguments in the Python script.

  1. sys.argv
  2. getopt
  3. argparse

1. Reading Python Command-line arguments using the sys module

The command-line arguments are stored in the sys module argv variable, which is a list of strings. We can read the command-line arguments from this list and use it in our program.

Note that the script name is also part of the command-line arguments in the sys.argv variable.

import sys

if len(sys.argv) != 2:
    raise ValueError('Please provide email-id to send the email.')

print(f'Script Name is {sys.argv[0]}')

email = sys.argv[1]

print(f'Sending test email to {email}')

Output:

$ python3.7 command-line-args.py test@askpython.com
Script Name is command-line-args.py
Sending test email to test@askpython.com
$ python3.7 command-line-args.py                   
Traceback (most recent call last):
  File "command-line-args.py", line 4, in <module>
    raise ValueError('Please provide email-id to send the email.')
ValueError: Please provide email-id to send the email.
$

2. Parsing Command-line arguments using the getopt module

Python getopt module works in a similar way as Unix getopt() function. This module is helpful when you want the script to accept options and their values, similar to the many Unix commands.

This module works in conjunction with the sys.argv to parse the command-line arguments and extract the options values in a list of tuples.

import getopt
import sys

argv = sys.argv[1:]

opts, args = getopt.getopt(argv, 'x:y:')

# list of options tuple (opt, value)
print(f'Options Tuple is {opts}')

# list of remaining command-line arguments
print(f'Additional Command-line arguments list is {args}')

Output:

$ python3.7 command-line-args.py -x 1 -y 2 A B            
Options Tuple is [('-x', '1'), ('-y', '2')]
Additional Command-line arguments list is ['A', 'B']
$ 

3. Parsing Command-line arguments using argparse module

Python argparse module is the preferred way to parse the command-line arguments. It provides a lot of option such as positional arguments, the default value for arguments, the help message, specifying the data type of argument, etc.

import argparse

# create parser
parser = argparse.ArgumentParser()

# add arguments to the parser
parser.add_argument("language")
parser.add_argument("name")

# parse the arguments
args = parser.parse_args()

# get the arguments value
if args.language == 'Python':
	print("I love Python too")
else:
	print("Learn Python, you will like it")
	
print(f'Hello {args.name}, this was a simple introduction to argparse module')

Output:

$ python3.7 command-line-args.py Python David
I love Python too
Hello David, this was a simple introduction to argparse module
$
$ python3.7 command-line-args.py Java Lisa   
Learn Python, you will like it
Hello Lisa, this was a simple introduction to argparse module
$
$ python3.7 command-line-args.py -h       
usage: command-line-args.py [-h] language name

positional arguments:
  language
  name

optional arguments:
  -h, --help  show this help message and exit
$

Notice that the help message is automatically generated by the argparse module.


Conclusion

If your script requires simple command-line arguments, you can go with sys.argv. But, if your program accepts a lot of positional arguments, default argument values, help messages, etc, then you should use argparse module. The getopt module works too but it’s confusing and hard to understand.


References: