En este post describo cómo ejecutar un script python con argumentos desde el cmd, usando argparse. Mostraré varios ejemplos para comprender el funcionamiento. También puedes revisar otras formas de ejecutar scripts python
Argparse
Es un módulo que forma parte de la biblioteca estandar python para analizar argumentos enviados desde la línea de comandos. Argparse
es un analizador sintáctico, usaré el término parser para referirme al analizador sintáctico como muestra en su documentación oficial.
Argparse – python
Consideremos 4 puntos importantes para empezar a usar argparse
import argparse
parser = argparse.ArgumentParser()
, Crear un objeto de ArgumentParser llamado parser:parser.add_argument()
, Añadir argumentos a parserargs = parser.parse_args()
, Analizar argumentos:
Nota: Los códigos en todo el post se ejecutan con python 3
Ejemplo1 – argparse
El ejemplo1, imprime exactamente lo mismo que ingresas como argumento, igual que en Gif 2 ¡Veámos como va!
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("texto")
args = parser.parse_args()
#Imprimir en el terminal el resultado
print(args.texto)
Guardo el anterior código con el nombre ejemplo1.py
y en la terminal ejecuto el script añadiendo cualquier caracter o texto como augumento (mi texto es “Hola_kipuna”), así:
kipuna@kipuna:~/Escritorio$ python3 ejemplo1.py Hola_kipuna
¡El ejemplo1 fue sencillo!, pero argparse
es mucho mas que eso 😀
Ejemplo2 – argparse
En este ejemplo2 añadiremos dos argumentos en la linea de comandos (Tu nombre y un número para obtener el valor al cuadrado).
Nota: Mientras avance con los ejemplos iré añadiendo más parámetros a el método add_argument(), aquí en este ejemplo añadimos el tipo de dato.
Tipo de dato
Además de añadir un nuevo argumento "x"
, especifico el tipo de dato (type
) al que debe convertirse el argumento de la línea de comandos.
- nombre es de tipo
str
- x es de tipo
float
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("nombre", type = str)
parser.add_argument("x", type = float)
args = parser.parse_args()
print('Hola,',args.nombre,'! El valor al cuadrado de', args.x, 'es', args.x**2 )
Mensajes de ayuda
Con el mismo ejemplo2 agregaré un mensaje de ayuda que añade una descripción al argumento. En cada .add_argument
agrego el parámetro help
.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("nombre", type = str, help = 'Tu nombre')
parser.add_argument("x", type = float, help = 'Número para encontrar el cuadrado')
args = parser.parse_args()
print('Hola,', args.nombre, '! el valor al cuadrado de', args.x, 'es', args.x**2 )
Los mensajes de ayuda, permiten recordar que valores debemos ingresar en la línes de comandos para que los argumentos tengan sentido y funcione el código. Para que aparezca la ayuda se debe escribir -h
después del script , así:
kipuna@kipuna:~/Escritorio$ python3 ejemplo2.py -h
El resultado será como se muestra a continuación:
Usage
: Muestra el nombre del script y los argumentos que puede recibir, en este ejemplo son:-h
nombre
x
. Algunos son argumentos posicionales imprescindibles para funcionar comonombre
yx
; otros no como-h
que es un argumento opcional.positional arguments
: Son argumentos que debe recibir el script para funcionar, junto se muestra una breve reseña de lo que recibe como argumento (nombre
x
).optional arguments
: Son opcionales, no son imprescindibles para funcionar como:-h
que es la ayuda.
Ejemplo3 – argparse
En este ejemplo se introducen varios argumentos numéricos y se suman entre ellos. También se introduce el parámetro nargs
al método add_argument()
Número de argumentos en la linea de comandos – nargs
nargs asocia un número diferente de argumentos de línea de comandos con una sola acción. Los valores permitidos en nargs son:
N
se especificando un número entero ej:nargs=6
'*'
ingresan multiples argumentos y se recogen en una lista'+'
ingresan multiples argumentos y se recogen en una lista igual que'*'
, pero si no ingresa ningun argumento mostrará un mensaje de error.'?'
ingresará un valor desde la linea de comandos si es posible
En el siguiente código especifico nargs
como nargs=6
, imprimo los enteros que ingresan y sumo esos valores.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('enteros', type=int, nargs=6)
args = parser.parse_args()
print(args.enteros)
print(sum(args.enteros))
Ejecutar en la terminal
kipuna@kipuna:~/Escritorio$ python3 ejemplo3.py 2 1 4 5 0 3
El resultado es como muestra a continuación:
En el siguiente código especifico a nargs
como nargs='*'
, puedo ingresar tantos valores como necesite. Imprimo los enteros que ingresen y sumo esos valores.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('enteros', type=int, nargs='*')
args = parser.parse_args()
print(args.enteros)
print(sum(args.enteros))
Ejecutar en la terminal
kipuna@kipuna:~/Escritorio$ python3 ejemplo3.py 7 4 9 10 2 0 1 5
En este ejemplo ingreso 8 valores, aparecerá la lista de los enteros ingresados y la suma de los mismos. Cuando no ingreso ningun valor como argumento, la lista aparece vacía.
En el siguiente código especifico a nargs
como nargs='+'
, puedo ingresar tantos valores como necesite igual que con nargs='*'
. La diferencia es que cuando no ingresa ningun valor aparece un mensaje de error. nargs='+'
requiere al menos 1 valor
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('enteros', type=int, nargs='+')
args = parser.parse_args()
print(args.enteros)
print(sum(args.enteros))
Ejecutar en la terminal
kipuna@kipuna:~/Escritorio$ python3 ejemplo3.py 7 4 9 10 2 0 1 5
En el siguiente código especifico nargs
comonargs='?'
, este recibirá un solo valor.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('entero', type=int, nargs='?')
args = parser.parse_args()
print(args.entero)
print(type(args.entero))
Ejecutar en la terminal, cuando no se ingresa un valor mostrara lo siguiente:
Ejemplo4 – argparse
En este ejemplo aplico argumentos opcionales. Los argumentos opcionales se especifican con doble guión --
o guión simple -
1.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--text")
args = parser.parse_args()
if args.text:
print(args.text)
Ejecutar en la terminal:
kipuna@kipuna:~/Escritorio$ python3 ejemplo4.py --text Hola_Milu
En este ejemplo , si al ejecutar omito el argumento, no mostrará ningun mensaje porque se trata de un argumento opcional, así:
Ejemplo5 – argparse
Este ejemplo será similar al ejemplo2, con la diferencia que ingreso dos argumentos uno posicional nombre
y un argumento opcional valor
. el programa imprimirá tu nombre y encontrará el cuadrado del número que ingrese.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("nombre", type=str, help = 'Ingresa tu nombre')
parser.add_argument("--valor", type=float, help = 'Ingresa un numero para elevar al cuadrado')
args = parser.parse_args()
print('Hola,',args.nombre)
if args.valor:
print('El valor al cuadrado de', args.valor, 'es', args.valor**2)
Ejecuto en la terminal y obtengo:
kipuna@kipuna:~/Escritorio$ python3 ejemplo5.py Milu
Omito el argumento opcional y no aparece error
Ejecutar el script con el argumento posicional y el opcional
kipuna@kipuna:~/Escritorio$ python3 ejemplo5.py Milu --valor 5
Ejemplo6 – argparse
En este ejemplo describo como funciona el parámetro action de add_argument()
. Algunas acciones de action
son: 'store'
, 'store_const'
, 'store_true'
, 'store_false'
, 'append'
, 'append_const'
, 'extend'
action='store'
Es la opción por defecto y almacena el valor del argumento, por ejemplo:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--nombre', action='store')
args = parser.parse_args()
print(args.nombre)
Ejecutar script
kipuna@kipuna:~/Escritorio$ python3 ejemplo5.py --nombre Milu
action='store_const'
El valor del argumento es lo que se establece en la la palabra clave const
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--nombre', action='store_const', const= "Milu")
args = parser.parse_args()
print(args.nombre)
Para ejecutar este acript se debe ingresar --nombre
sin nada más adicional porque action='store_const'
guarda el valor establecido en const
como variable, en este ejemplo se almacenará la palabra "Milu"
.
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --nombre
Nota: El script tiene la funcion print
por lo que si se omite el nombre del argumento opcional, --nombre
por defecto imprimirá none
action='store_true'
y action='store_false'
Son casos especiales de 'store_const'
usados para almacenar los valores True y False respectivamente.
import argparse
import numpy as np
parser = argparse.ArgumentParser()
parser.add_argument('--dato1', action='store_true')
parser.add_argument('--dato2', action='store_false')
args = parser.parse_args()
print(args.dato1)
print(args.dato2)
Ejecutar script con la siguiente línea
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --dato1 --dato2
Si omito el argumento --dato1
en la terminal, al ejecutar el script se crea automáticamente un valor predeterminado de False
, y del mismo modo store_false
establece de forma predeterminada True
cuando el argumento de la línea de comandos no esté presente.
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py
Aunque no ingrese ningun argumento desde la terminal se imprimirá True
o False
porque en el scrip uso la funcion print
para mostrar el estado de las variables, en este ejemplo muestra los valores por defecto.
action='append'
Añade a una lista cada valor ingresado como argumento
import argparse
import numpy as np
parser = argparse.ArgumentParser()
parser.add_argument('-n','--numeros', action='append', type=float)
args = parser.parse_args()
print(args.numeros)
print(type(args.numeros))
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py -n 1 -n 2 -n 3 -n 4
action='append_const'
Almacena el valor de const
en una lista, de acuerdo a los argumentos que ingresan desde la terminal.
El siguiente script almacena los valores de la densidad de varios líquidos, y desde la terminal se elige la densidad del elemento que desee.
import argparse
import numpy as np
#Densidad [g/cm3] de algunos liquidos en una lista
parser = argparse.ArgumentParser()
parser.add_argument('--agua', dest='densidades', action='append_const', const= 1)
parser.add_argument('--aceite', dest='densidades', action='append_const', const=0.9)
parser.add_argument('--gasolina', dest='densidades',action='append_const',const=0.7)
parser.add_argument('--petroleo' , dest='densidades',action='append_const',const=0.8)
args = parser.parse_args()
print(args.densidades)
Escribo cuatro elementos para conocer sus desidades.
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --agua --aceite --gasolina --petroleo
Escribo dos elementos para conocer sus densidades
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --agua --petroleo
action='extend'
Extiende cada valor del argumento a una lista.
import argparse
import numpy as np
parser = argparse.ArgumentParser()
parser.add_argument("--foo", action="extend", nargs="+", type=int)
args = parser.parse_args()
print(args.foo)
Ejecutar en la terminal
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --foo 4213756 --foo 4
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --foo 421 3 756 --foo 4
Ejemplo7- argparse
En la documentación oficial de python encuentras este ejemplo que lo guardaré como ejemplo7.py
, aquí explicaré como funciona. El código es el siguiente:
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
Primero revisemos la ayuda que muestra este script al momento de ejecutar.
kipuna@kipuna:~/Escritorio$ python3 ejemplo7.py -h
usage
: Muestra la sintaxis que debe ingresar. Los comandos opcionales[-h] [--sum]
y los argumentos posicionalesN [N ...]
, aparece los valores de N porque se especifica así en el parámetrometavar
.Process some integers.
es la leyenda que se agrega en la descripción.positional arguments:
N representa números enteros que pueden ingresar al programaoptional arguments:
-h mensaje de ayuda. –sum suma los valores ingresados como N, por defecto obtiene el máximo valor de los enteros ingresados.
Ahora ejecuto el programa sin el parámetro opcional
kipuna@kipuna:~/Escritorio$ python3 ejemplo7.py 45 3 -23 4 -6 0
Y ahora ejecuto el programa con el parámetro opcional --sum
kipuna@kipuna:~/Escritorio$ python3 ejemplo7.py --sum 45 3 -23 4 -6 0
Referencias
- Python argparse documentación. Guión simple – guión doble. https://docs.python.org/3/library/argparse.html#required