Inicio > Programing > Procesando parámetros en la línea de comando en Python

Procesando parámetros en la línea de comando en Python

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
  1. 21 noviembre, 2016 en 08:55

    Muy bueno y bien explicado. No se por que no sales el primero en google cuando se busca este tema. Gracias

    • 21 noviembre, 2016 en 17:40

      Hola Simon!

      Que gusto que te haya sido de utilidad, gracias por tomarte unos segundos para dejar este mensaje y en cuanto a las búsquedas en google, algún día será.

      Espero que disfrutes tu código 😉
      Salu2+

  2. 1 enero, 2017 en 18:06

    Reblogueó esto en Espacio de simo.

    • 1 enero, 2017 en 18:11

      Hola Simón!

      Muchas gracias por compartir este post y aprovecho para desearte un furctífero 2017!

      Que el código te acompañe 😉
      Salu2+

  3. Roberto Honori
    12 enero, 2017 en 06:06

    Excelente, gracias por el tiempo: Pregunto sabes como pasar parametros, variables leidas o captadas dentro de un programa.
    Ejemplo: El codigo de la empresa, para una aplicacion multiempresa, que a la vez es, multiusuario… Gracias nuevamente.

    • 12 enero, 2017 en 10:03

      Hola Roberto!

      Gracias a ti también por tomarte el tiempo para comentar, siempre es enriquecedor 😉

      En cuanto a tu pregunta, creo que dependerá mucho de las posibilidades de el programa a ejecutar, de si se puede modificar o como puede enviar y recibir información, por el ejemplo que mencionas, me parece que es un programa ya hecho por lo que asumo que posiblemente no se pueda modificar porque es un programa comercial, así que sólo queda ejecutarlo y esperar los resultados, estos últimos seguro los quieres tomar como entrada para tu programa.

      En python hay varias maneras de ejecutar programas externos, por ejemplo puedes hacer alggo como lo siguientes desde el shell de Python directamente:
      —-python v2.7
      >>> import os
      >>> print os.popen(“ls -lF”).read()

      —-python v3.x
      >>> import os
      >>> print(os.popen(“ls -lF”).read())

      la salida como podrás comprobar es lo que arroja el ls, pero igual lo puedes guardar en una variable y entonces procesarlo, por ejemplo:

      —-python2
      >>> salida = os.popen(“ls -lF”).read() # guardamos el resultado de ls en salida
      >>> lineas = salida.split(“\n”) # separamos por líneas
      >>> listado = [linea for linea in lineas if len(linea)>10] # eliminamos lo que no sea archivos o directorios
      >>> for l in listado: # imprimimos la lista de archivos o directorios
      >>> print l

      En este caso listado es una variable que contiene la salida del comando ls y que ya estamos procesando.

      Espero te sea de utilidad
      Salu2+

  4. Daniela
    30 noviembre, 2017 en 09:38

    Gracias valedor

    • 6 diciembre, 2017 en 13:33

      Hola Daniela

      Gracias por comentar, es bueno saber que ha sido de utilidad 😉

      Salu2+ y a seguir codeando!

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

PiKon

3D Printing + Raspberry Pi Camera = PiKon Telescope

gvSIG blog

gvSIG project blog

Python Adventures

Welcome to the Jungle!

A %d blogueros les gusta esto: