Aquí va otro post sobre las cosillas que últimamente he ido aprendiendo. Esta vez toca desarrollar un script para ser ejecutado con argumentos. Resulta que estoy poniendo a punto un script para luego crear una interfaz web con Python-Django donde quiero que el usuario seleccione unas funciones sí y otras no. Para testear esto decidí implentar selección e argumentos para que fuera ejecutado tal que así:
$ python myscript.py -a -t $ python my script.py -t -z
Me he ayudado de la librería getopt. Sé que es un poco rudimientario de momento, pero me ha hecho el apaño. Parece ser que argparse es un módulo mejorado, aunque no le he metido mano. No obstante, si alguien conoce otra manera o tiene alguna sugerencia, por favor, que avise.
Bien, en primer lugar debemos importar los módulos necesarios:
import sys, getopt, os
Después definimos una función donde describiremos los argumentos:
try: opts, args = getopt.getopt(sys.argv[1:], "abc:dh", ["funcion1", "funcion2", "funcion3", "funcion4", "help"]) except getopt.GetoptError, err: # print help information and exit: print str(err) # will print something like "option -a not recognized" usage() sys.exit(2)
En este caso a,b,c,d y e son nuestros argumentos y seguidamente aparece el nombre de la función a la que hacen la llamada conocadas en el mismo orden que los argumentos. Los «:» que aparecen despues de «c» significan que reguiere un argumento adicional para llamar a la función como puede ser el nombre de un fichero. En estas líneas además, vemos que si no se introduce ningún argumento, salta un mensaje de error (definido por usage()) y se corta el script. Dicho mensaje se puede definir de esta forma:
def usage(): print """ NOMBRE \t MyScript - Es la leche\n MODO DE EMPLEO \t python caipyranha.py [-a] [-b] [-c] [-d] [-h]\n \t Los nombres de los ficheros y carpetas deben ir sin espacios.\n \t Se debe respetar el orden marcado arriba excepto para la opción -b, pudiéndose saltar alguna \t opción excepto -e.\n \t Debe indicar la pareja de primers utilizada para amplificar el producto.\n \t Debe indicar el intervalo de la etiqueta que quiere utilizar para hacer comparaciones.\n OPCIONES \t -a \t Realiza la función 1 \t -b \t Realiza la función 2 \t -c \t Realiza la función 3 \t -d \t Realiza la función 4 \t -e \t Abre esta guía de ayuda """
Ahora que tenemos esto definido, vamos a indicar las funciones que ejecuta cada argumento:
for o, a in opts: if o in ("-h", "--help"): usage() sys.exit() elif o in ("-a", "--afuncion"): for sequencia in lista_files: funcion1(str(sequencia)) print "\n\n Función 1 realizada" elif o in ("-b", "--bfuncion"): funcion2() print "\n\n Función 2 realizada" elif o in ("-c", "--cfuncion"): funcion3() elif o in ("-d", "--dfuncion"): funcion4() else: assert False, "error"
Y con estoy bastará para que tengamos a punto nuestro script para que se ejecute con argumentos.