[Python] Implementing input options in bash style on a python program
Hi! In this article I’ll explain how to implement input options like bash/linux options in python programs. We’ll develop a basic python program with simple and extended options with various argument types.
ENVIRONMENT
- Fedora 31 [OS]
- Python 3.7 [interpreter]
- argparse [python module]
1 – Installation
- Python: see intallation guide at https://www.ithack.it
- argparse: use the following command
pip3 install argparse [--user]
#use --user option for local-user installation (needed if you don't have root privilege)
#you can use pip2 if want to install module for python2
2 – Argparse init (see argparse documentation)
You have to implement your parser with 3 simple lines:
### MODULES
import argparse
### PARSER
parser = argparse.ArgumentParser(description='options example')
### GET PARAMETERS
args = parser.parse_args()
3 – Argparse add_argument() (see add_argument() documentation)
- Adding integer parameters
- Adding string parameters
- Adding boolean parameters
You need to add parameters with add_argument() function, see code below with explained examples:
### PARSER
parser = argparse.ArgumentParser(description='options example')
### ADD ARGUMENTS
#add argument that support multiple string in input without option
parser.add_argument('files', metavar='f', type=str, nargs='+',
help='input file[s]')
#add option "-s" followed by single string
parser.add_argument('-s', metavar='', type=str, nargs=1, default=[''], dest='single-string',
help='single string parameter (default: empty)')
#add option -i followed by single number
parser.add_argument('-i', metavar='', type=int, nargs=1, default=[0], dest='single-number',
help='single number parameter (default: 0)')
#add extended option "--multiple-strings" followed by multiple strings separated by space
parser.add_argument('--multiple-strings', metavar='', type=str, nargs='+', default=[''], dest='multiple-strings',
help='multiple strings parameter (default: empty)')
#add extended option "--multiple-numbers" followed by multiple number separated by space
parser.add_argument('--multiple-numbers', metavar='', type=int, nargs='+', default=[0], dest='multiple-numbers',
help='multiple-numbers (default: 0)')
#add extended option "--bool" that, without imput, if present set variable "bool" to True
parser.add_argument('--bool', default=False, dest='bool', action='store_true',
help='boolean parameter (default: False)')
The argparse module automatically adds help and usage output:
[learn@ithack ~]$ python3 options.py --help
usage: options.py [-h] [-s] [-i] [--multiple-strings [...]]
[--multiple-numbers [...]] [--bool]
f [f ...]
options example
positional arguments:
f input file[s]
optional arguments:
-h, --help show this help message and exit
-s single string parameter (default: empty)
-i single number parameter (default: 0)
--multiple-strings [ ...]
multiple strings parameter (default: empty)
--multiple-numbers [ ...]
multiple-numbers (default: 0)
--bool boolean parameter (default: False)
4 – Principal parameters of function add_argument()
e.g.: parser.add_argument(‘arg-name’, metavar=’ ‘, type=arg-type, nargs=n_args, default=default_value, dest=’var-name’, help=’help text’)
- first, ‘arg-name’, string, parameter name: if preceded by “-” or “–” become an optional argument; else become a positional argument
- second, metavar=’ ‘, string, metavar name: optional parameter used to change metavar name in help text, it’s often used to leave blank metavar name
- third, type=arg-type, type, data-type: used to select data-type like float, int, string, etc.
- fourth, nargs=n_args, string or int, number of input: used to accept a defined number of input for parameter if int value greater than 1; or undefined number of parameters if ‘+’
- fifth, default=default_value, value, default value: optional parameter used if you need to have a default value when option is not present in program call; any data-type/value can be used like int, string, list, etc. (e.g.: [‘a’])
- sixth, dest=’var-name’, string, destination variable: used to populate a variable with input value
- seventh, help=’help text’, string, help text: used when the help is printed
5 – Complete program implementing argparse
### MODULES
import argparse
### FUNCTIONS
def args_parser():
parser = argparse.ArgumentParser(description='options example')
parser.add_argument('files', metavar='f', type=str, nargs='+',
help='input file[s]')
parser.add_argument('-s', metavar='', type=str, nargs=1, default=[''], dest='single-string',
help='single string parameter (default: empty)')
parser.add_argument('-i', metavar='', type=int, nargs=1, default=[0], dest='single-number',
help='single number parameter (default: 0)')
parser.add_argument('--multiple-strings', metavar='', type=str, nargs='+', default=[''], dest='multiple-strings',
help='multiple strings parameter (default: empty)')
parser.add_argument('--multiple-numbers', metavar='', type=int, nargs='+', default=[0], dest='multiple-numbers',
help='multiple-numbers (default: 0)')
parser.add_argument('--bool', default=False, dest='bool', action='store_true',
help='boolean parameter (default: False)')
args = parser.parse_args()
return args
### INIT
args = vars(args_parser())
print(args)
6 – Execution
[learn@ithack ~]$ python3 options.py FILE
{'files': ['FILE'],
'single-string': [''],
'single-number': [0],
'multiple-strings': [''],
'multiple-numbers': [0],
'bool': False}
[learn@ithack ~]$ python3 options.py FILE1 FILE2 -s STRING -i 1 --multiple-strings S1 S2 S3 --multiple-numbers 1 2 3 --bool
{'files': ['FILE1', 'FILE2'],
'single-string': ['STRING'],
'single-number': [1],
'multiple-strings': ['S1', 'S2', 'S3'],
'multiple-numbers': [1, 2, 3],
'bool': True}