argparser-01
Seguramente tarde o temprano te llegará el día donde tu script creado en python requiera de uno o varios parámetros en la línea de comandos y entonces pegas el grito en el cielo y sales corriendo a contárselo a tu mejor amigo (claro si tienes amigos!).

Así que manos a la obra…

Leyendo los parámetros

En el siguiente código muestro como leer todo lo que se escriba después del nombre del script

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

print "Número de parámetros: ", len(sys.argv)
print "Lista de argumentos: ", sys.argv

Así de simple, y el resultado es algo como lo siguiente:

$ python parametros-basico.py 
Número de parámetros:  1
Lista de argumentos:  ['parametros-basico.py']
$ python parametros-basico.py -a ALL file1 file2
Número de parámetros:  5
Lista de argumentos:  ['parametros-basico.py', '-a', 'ALL', 'file1', 'file2']
$

Esto ya es pan comido, fué una concha!

Procesando parámetros

Al revisar varias de las opciones, parece que lo más recomendado es usar argparse, así que primero un ejemplo simple, procesando la opción -h o –help.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse

parser = argparse.ArgumentParser()
parser.parse_args()

Y así de simple (esto es la fortaleza de python!), pero y el resultado del código se ve así:

$ python argparse-basico.py

$ python argparse-basico.py -h
usage: argparse-basico.py [-h]

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

$ python argparse-basico.py --help
usage: argparse-basico.py [-h]

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

Ahora veamos algo un poco más complicado, quiero adicionar la clásica opción -v para depurar el proceso, lo que se haría como sigue:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="Mostrar información de depuración", action="store_true")
args = parser.parse_args()

# Aquí procesamos lo que se tiene que hacer con cada argumento
if args.verbose:
    print "depuración activada!!!"

Y el resultado es:

$ python argparse-mas-una-opcion.py  -h
usage: argparse-mas-una-opcion.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  Mostrar información de depuración

$ python argparse-mas-una-opcion.py  -v
depuración activada!!!

$ python argparse-mas-una-opcion.py  --verbose
depuración activada!!!

Así que ya está más que listo, pero falta el ejemplo avanzado, que tal una opción del tipo “-f filename”, mi lǵica me dice que tiene que ser algo como:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="Mostrar información de depuración", action="store_true")
parser.add_argument("-f", "--file", help="Nombre de archivo a procesar")
args = parser.parse_args()

# Aquí procesamos lo que se tiene que hacer con cada argumento
if args.verbose:
    print "depuración activada!!!"

if args.file:
    print "El nombre de archivo a procesar es: ", args.file

Y el resultado se veee asíiii:

$ python argparse-mas-una-opcion-mas-valor.py -h
usage: argparse-mas-una-opcion-mas-valor.py [-h] [-v] [-f FILE]

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         Mostrar información de depuración
  -f FILE, --file FILE  Nombre de archivo a procesar

$ python argparse-mas-una-opcion-mas-valor.py -f agenda.txt
El nombre de archivo a procesar es:  agenda.txt

Excelente, la lógica del módulo funciona como se espera y tal es el caso que no he tenido que revisar documento para escribir el último ejemplo, posiblemente Tú también hayas llegado al mismo código.

Así que ahora ya no hay pretexto para no incluir cuando menos un -h en sus códigos heeeee!

Anuncios