Categories

[Python] Implementing input options in bash style on a python program

You are here:
  • Main
  • Linux
  • [Python] Implementing input options in bash style on a python program
< All Topics

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

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}
Table of Contents