Introducción a la programación en Python

clase 08a
Argumentos en la línea de comando I

Al invocar un programa desde la línea de comando, frecuentemente podemos querer pasarle argumentos que controlen algún aspecto de su comportamiento. Por ejemplo, si el programa procesa información almacenada en un archivo, se lo puede invocar pasándole el nombre del archivo a procesar. De esa manera, se puede utilizar el mismo programa para procesar cualquier archivo, sin necesidad de modificar el código.

sys.argv

La forma más básica y sencilla de procesar los argumentos de la línea de comando es mediante la función argv, provista por el módulo sys.

Para que esta función esté accesible, al escribir el programa en Python primero se debe importar el módulo mediante la instrucción import sys. Al invocar el programa, se puede agregar en la línea de comando una serie de argumentos, que son cadenas de caracteres separados por espacio en blanco:

programa.py argumento_1 argumento_2 [.... argumento_N]

Si un argumento debe incluir espacios en blanco, la cadena debe encerrarse entre comillas:

programa.py "argumento con espacios"

La función sys.argv devuelve una lista de cadenas de caracteres, correspondientes a cada uno de los argumentos escritos al invocar el programa.

Los argumentos se ordenan en la lista tal como aparecen en la línea de comando, y por tanto se los llama argumentos posicionales. El primer elemento de la lista (sys.argv[0]) es el nombre el programa. La cantidad de argumentos pasados al invocar el progrma se obtiene con la función len(sys.argv).

Ejemplos

Todos los programas de ejemplo se encuentran en el mismo directorio donde se está corriendo este entorno. La instrucción %load carga el programa del disco a una celda, para poder ser ejecutado con la instrucción !python. Esto sólo se aplica al entorno que se utiliza para dar la clase.

Para ejecutar un programa desde la línea de comando en sus computadoras, deben utilizar la instrucción python (o python3, según corresponda) desde una terminal, en el mismo directorio en el que se encuentran los programas de ejemplo, tal como se vio al comienzo del curso.

El primer programa solamente utiliza la función sys.argv para crear una lista con todos los argumentos, que se asigna a la variable args.

Luego se imprime la lista de argumentos, y su número.

In [ ]:
import sys

args = sys.argv
print("argumentos:", args)
print("cantidad de argumentos:", len(args))

Si el programa se invoca sin argumentos adicionales, la lista va a tener solamente un argumento, que es el nombre del programa.

In [1]:
# %load sysargv_1.py
In [2]:
!python sysargv_1.py
argumentos: ['sysargv_1.py']
cantidad de argumentos: 1

Todos los argumentos adicionales que se incluyan en la línea de comando, serán agregados a la lista generada por sys.argv. Si la cadena de algún argumento incluye espacios en blanco, deberá ser delimitada por comillas.

In [3]:
!python sysargv_1.py arg1 "arg 2" arg_3
argumentos: ['sysargv_1.py', 'arg1', 'arg 2', 'arg_3']
cantidad de argumentos: 4

El siguiente programa asigna el primer argumento (sys.argv[0]) a la variable nombre, e incluye en la lista de argumentos (args) todos los argumentos siguientes (sys.argv[1:]).

In [ ]:
import sys

nombre = sys.argv[0]
args = sys.argv[1:]
print("nombre del programa:", nombre)
print("argumentos:", args)
print("cantidad de argumentos:", len(args))
In [4]:
# %load sysargv_2.py
In [5]:
!python sysargv_2.py arg1 arg_2 "arg 3"
nombre del programa: sysargv_2.py
argumentos: ['arg1', 'arg_2', 'arg 3']
cantidad de argumentos: 3

Algunos programas pueden requerir uno o más argumentos para ejecutarse (p.ej. el nombre del archivo a procesar). En ese caso, conviene primero verificar que se invocó al programa con la cantidad necesaria de argumentos, y en caso contrario se puede imprimir un mensaje a la salida estándar, y salir del programa mediante la función exit() del módulo sys.

La función sys.exit() puede aceptar un argumento opcional: el entero 0 indica que el programa concluyó exitosamente, cualquier otro argumento indica algún tipo de error.

In [ ]:
import sys

if len(sys.argv) < 2:
    print("El programa necesita un argumento.")
    sys.exit(1)
else:
    print(sys.argv[1])
In [6]:
# %load sysargv_3.py
In [7]:
!python sysargv_3.py
El programa necesita un argumento.
In [8]:
!python sysargv_3.py "Hola, Python"
Hola, Python

El programa solamente procesa un argumento después del nombre del programa, cualquier argumento adicional es ignorado.

In [9]:
!python sysargv_3.py "Hola, Python" foo
Hola, Python

El programa anterior se puede modificar para procesar todos los argumentos adicionales.

In [ ]:
import sys

if len(sys.argv) < 2:
    print("El programa necesita al menos un argumento.")
    sys.exit(1)
else:
    for arg in sys.argv[1:]:
        print(arg)
In [10]:
# %load sysargv_4.py
In [11]:
!python sysargv_4.py "Hola, Python" foo
Hola, Python
foo

Ejemplo 8.1

El código del siguiente programa se puede incorporar al programa de melodía isorrítmica de la tarea del módulo 5, de manera de pasar los valores del color y de la talea, como argumentos al invocar el programa.

In [ ]:
import sys

print('''
Crea una melodía isorrítmica a partir de una talea y un color.

Recibe dos argumentos:
una secuencia de alturas en número de nota MIDI [color]
y otra de duraciones en fracciones de beat [talea].

Los argumentos se pasan como cadenas de caracteres,
con los valores separados por espacios.
''')

if len(sys.argv) < 3:
    print("El programa necesita dos argumentos: color y talea.")
    sys.exit(1)
else:
    color = sys.argv[1].split()
    talea = sys.argv[2].split()
    print("color:", color)
    print("talea:", talea)
In [12]:
# %load sysargv_5.py
In [13]:
!python sysargv_5.py
Crea una melodía isorrítmica a partir de una talea y un color.

Recibe dos argumentos:
una secuencia de alturas en número de nota MIDI [color]
y otra de duraciones en fracciones de beat [talea].

Los argumentos se pasan como cadenas de caracteres,
con los valores separados por espacios.

El programa necesita dos argumentos: color y talea.
In [14]:
!python sysargv_5.py "60 59 63 52"
Crea una melodía isorrítmica a partir de una talea y un color.

Recibe dos argumentos:
una secuencia de alturas en número de nota MIDI [color]
y otra de duraciones en fracciones de beat [talea].

Los argumentos se pasan como cadenas de caracteres,
con los valores separados por espacios.

El programa necesita dos argumentos: color y talea.
In [15]:
!python sysargv_5.py "60 59 63 52" "0.75 0.5 0.5 0.25 0.75"
Crea una melodía isorrítmica a partir de una talea y un color.

Recibe dos argumentos:
una secuencia de alturas en número de nota MIDI [color]
y otra de duraciones en fracciones de beat [talea].

Los argumentos se pasan como cadenas de caracteres,
con los valores separados por espacios.

color: ['60', '59', '63', '52']
talea: ['0.75', '0.5', '0.5', '0.25', '0.75']