Solución al ejercicio de programas ejecutables y línea de comandos

La semana pasada planteaba un problema partiendo del siguiente programa:

#!/usr/bin/python3
import sys

# usuario = "lector de PItando"
usuario = sys.argv[1]
print("Hola, ", usuario)

exit(0)

El ejercicio decía así:

Modifica el programa para que funcione de la siguiente forma:

  1. Si su primer argumento es “?” imprima un mensaje para ayudarnos a usarlo, en el que salga el nombre del programa ejecutable (para lo que tendrás que usar la variable sys.argv).
  2. Si no se especifica ningún argumento, debe saludar al lector (“Hola, lector“).Para detectar la longitud de una lista, usa la función len(lista).
  3. También haz que junte todos los argumentos en el mensaje de saludo. Para eso, ten en cuenta que en Python podemos juntar varias cadenas en una sola “sumándolas”:
cadena = "Hola" + ", Mundo"
# Cadena tendrá como valor "Hola, Mundo"

Vamos con la solución.

Lo mejor que podemos hacer es partir el problema en varios. Vamos a intentar detectar cuándo una lista está vacía, siguiendo el consejo del enunciado. Abre IDLE y prueba la función len(lista) con una lista que crearemos de una forma muy similar al conjunto, pero con corchetes (“[“, “]”) en lugar de llaves (“{“, “}”):

lista = [1, 2, 3]
len (lista)

El resultado que deberemos obtener es un 3: la lista tiene 3 elementos. Si creamos una lista vacía y examinamos su longitud, veremos que obviamente dará 0:

listaVacia = []
len (listaVacia)

Lo que ocurre es que, si os acordáis, sys.argv[0] siempre viene relleno con el nombre del programa ejecutable, por lo que la comparación no debe ser con 0, sino con 1. El programa se invocará sin parámetros si el tamaño de sys.argv es igual a 1. Así pues, nuestro programa tendrá que actuar en consecuencia:

...
if len (sys.argv) == 1:
    print ("Hola, lector.")
else:
...

El caso en el que el primer argumento sea “?” es muy fácil, simplemente hay que insertar un caso elif (posiblemente te tengas que desplazar a la derecha para ver todo el código):

...
if len (sys.argv) == 1:
    print ("Hola, lector")
elif sys.argv[1] == "?":
    print ("Uso de", sys.argv[0],":")
    print (" ", sys.argv[0], "nombre para saludar (y apellidos si se quiere).")
else:
...

Como ya vimos, la lista se accede poniendo el índice que deseamos leer entre corchetes. Prueba el siguiente código, que sirve para recorrer una lista:

indice = 0
while indice < len (lista):
    print("lista[", indice,"]:", lista[indice])
    indice = indice + 1

Como verás, la lista tiene 3 elementos, cuyos índices son 0, 1 y 2. EL último elemento de una lista siempre tiene como índice su longitud menos 1, ya que el primer elemento de la lista siempre tiene como índice el 0.

Ya sólo queda generar el saludo con todos los argumentos, si existen, y si el primero de ellos no es "?". Se hace con un while muy parecido al de arriba, así que directamente pondré el código definitivo del programa (posiblemente te tengas que desplazar a la derecha para ver todo el código):

 

#!/usr/bin/python3
import sys

if len (sys.argv) == 1:
    print ("Hola, lector.")
elif sys.argv[1] == "?":
    print ("Uso de", sys.argv[0], ": ")
    print (" ", sys.argv[0],"nombre para saludar (y apellidos si se quiere).")
else:
    cadenaSaludo = ""
    indice = 1
    while indice < len (sys.argv):
        cadenaSaludo = cadenaSaludo + sys.argv[indice] + " "
        indice = indice + 1
    print("Hola,", cadenaSaludo)
exit(0)

 

Recuerda que, si lo guardas en otro fichero diferente al que usaste la semana pasada, deberás darle permisos de ejecución si lo estás haciendo con la Raspberry Pi, otro ordenador con Linux, o con un Mac.

Y esto es todo. Con este ejercicio hemos repasado todo lo que conocemos: línea de comandos, programas ejecutables, bucles y condiciones. Recuerda que si tienes alguna duda puedes dejarla en los comentarios de esta entrada o a través del formulario de contacto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *