Guía completa de argumentos de línea de comandos en Python: uso de sys.argv y argparse

1. Uso básico de los argumentos de línea de comandos en Python

¿Qué son los argumentos de línea de comandos?

Cuando se ejecuta un programa en Python, la información adicional que se pasa junto con el comando de ejecución se denomina «argumentos de línea de comandos». Esto permite cambiar el comportamiento del programa de manera flexible y pasar datos desde el exterior de forma sencilla. Por ejemplo, al pasar un nombre de archivo o un valor de configuración como argumento, se puede modificar dinámicamente el contenido del programa.

Obtener argumentos de línea de comandos con sys.argv

En Python, se puede usar el módulo estándar sys para obtener los argumentos de línea de comandos. sys.argv es una variable que almacena los argumentos en forma de lista. El primer elemento de la lista (sys.argv[0]) es el nombre del script ejecutado, y los elementos posteriores son los valores pasados como argumentos.

Código de ejemplo: programa de cálculo sencillo

import sys

def main():
    if len(sys.argv) < 3:
        print("Error: se requieren 2 argumentos")
        return

    num1 = float(sys.argv[1])
    num2 = float(sys.argv[2])
    print(f"Suma: {num1 + num2}")

if __name__ == "__main__":
    main()
El programa anterior suma dos números pasados desde la línea de comandos y los muestra. Ejemplo de ejecución:
$ python script.py 3 5
Suma: 8.0
 

2. Procesamiento avanzado de argumentos con el módulo argparse

Conceptos básicos de argparse

Con sys.argv es posible obtener argumentos básicos, pero cuando el número de argumentos aumenta o se necesitan argumentos opcionales o banderas (como --verbose), el módulo estándar argparse resulta más conveniente. Este módulo permite analizar argumentos y generar mensajes de error automáticamente de forma sencilla.

Creación de un analizador de argumentos

Para usar argparse, primero se crea un analizador de argumentos. Luego, se configuran los argumentos en el analizador y finalmente se procesan los argumentos de la línea de comandos.

Código de ejemplo: uso básico de argparse

import argparse

def main():
    parser = argparse.ArgumentParser(description='Este es un programa de ejemplo')
    parser.add_argument('arg1', help='Primer argumento')
    parser.add_argument('arg2', type=float, help='Segundo argumento numérico')
    args = parser.parse_args()

    print(f"arg1 = {args.arg1}")
    print(f"arg2 = {args.arg2}")

if __name__ == "__main__":
    main()
Este programa recibe dos argumentos: arg1 se trata como una cadena, y arg2 como un número, ambos se muestran después del análisis.
$ python script.py test 5.5
arg1 = test
arg2 = 5.5

Procesamiento de argumentos opcionales y banderas

Una de las funciones más potentes de argparse es la posibilidad de manejar argumentos opcionales y banderas. Esto permite ejecutar código solo cuando se especifica un argumento y ofrecer salidas detalladas (como con la bandera --verbose).

Código de ejemplo: uso de argumentos opcionales y banderas

import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', action='store_true', help='Mostrar salida detallada')
    parser.add_argument('numbers', nargs='+', type=float, help='Lista de números')
    args = parser.parse_args()

    total = sum(args.numbers)
    if args.verbose:
        print(f"Detalles del cálculo: la suma de {args.numbers} es {total}")
    else:
        print(f"Suma: {total}")

if __name__ == "__main__":
    main()
En este programa, si se especifica la bandera --verbose, se mostrará una salida detallada; de lo contrario, se mostrará un resultado más simple.
$ python script.py 1 2 3 --verbose
Detalles del cálculo: la suma de [1.0, 2.0, 3.0] es 6.0
 
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. Manejo de errores y validación de argumentos

Validación de la cantidad y el tipo de argumentos

Al trabajar con argumentos de línea de comandos, es importante mostrar mensajes de error cuando el usuario no proporciona los argumentos correctamente para evitar un mal funcionamiento del programa. Verificar la cantidad y el tipo de argumentos permite mantener la estabilidad del programa.

Código de ejemplo: validación de cantidad y tipo de argumentos

import sys

def main():
    if len(sys.argv) != 3:
        print("Error: se requieren 2 argumentos")
        return

    try:
        num1 = float(sys.argv[1])
        num2 = float(sys.argv[2])
    except ValueError:
        print("Error: los argumentos deben ser numéricos")
        return

    print(f"Suma: {num1 + num2}")

if __name__ == "__main__":
    main()
En este programa, si la cantidad de argumentos no es tres (nombre del script + 2 números), se mostrará un mensaje de error. También se mostrará un error si los argumentos no son numéricos.

4. Casos de uso prácticos y aplicaciones

Ejemplo de creación de una herramienta de línea de comandos

Un ejemplo práctico de uso de argumentos de línea de comandos es crear herramientas que realicen operaciones de archivos o procesamiento de datos.

Código de ejemplo: herramienta para contar líneas de un archivo

import argparse

def main():
    parser = argparse.ArgumentParser(description='Herramienta para contar líneas de un archivo')
    parser.add_argument('filename', help='Nombre del archivo a contar')
    args = parser.parse_args()

    try:
        with open(args.filename, 'r') as file:
            lines = file.readlines()
            print(f"Número de líneas en {args.filename}: {len(lines)}")
    except FileNotFoundError:
        print(f"Error: el archivo {args.filename} no se encontró")

if __name__ == "__main__":
    main()
Esta herramienta cuenta y muestra el número de líneas en el archivo especificado.
$ python count_lines.py example.txt
Número de líneas en example.txt: 100

5. Conclusión

Aprender a manejar los argumentos de línea de comandos en Python permite dotar de flexibilidad a los programas. Desde el método sencillo con sys.argv hasta el manejo avanzado con argparse, es fundamental elegir la técnica adecuada según las necesidades. Además, incorporar validación de argumentos y manejo de errores permite crear programas más robustos.