| You are here: Inicio > Inmersión en Python > Scripts y flujos > Tratamiento de los argumentos en línea de órdenes | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Python admite la creación de programas que se pueden ejecutar desde la línea de órdenes, junto con argumentos y opciones tanto de estilo corto como largo para especificar varias opciones. Nada de esto es específico al XML, pero este script hace buen uso del tratamiento de la línea de órdenes, así que parece buena idea mencionarlo.
Es complicado hablar del procesamiento de la línea de órdenes sin entender cómo es expuesta a un programa en Python, así que escribiremos un programa sencillo para verlo.
Si aún no lo ha hecho, puede descargar éste ejemplo y otros usados en este libro.
#argecho.py import sys for arg in sys.argv:print arg
[usted@localhost py]$ python argecho.pyargecho.py [usted@localhost py]$ python argecho.py abc def
argecho.py abc def [usted@localhost py]$ python argecho.py --help
argecho.py --help [usted@localhost py]$ python argecho.py -m kant.xml
argecho.py -m kant.xml
| La primera cosa que hay de saber sobre sys.argv es que contiene el nombre del script que se ha ejecutado. Aprovecharemos este conocimiento más adelante, en Capítulo 16, Programación Funcional. No se preocupe de eso por ahora. | |
| Los argumentos en la línea de órdenes se separan con espacios, y cada uno aparece como un elemento separado en la lista sys.argv. | |
| Las opciones como --help también aparecen como un elemento aparte en la lista sys.argv. | |
| Para hacer las cosas incluso más interesantes, algunas opciones pueden tomar argumentos propios. Por ejemplo, aquí hay una opción (-m) que toma un argumento (kant.xml). Tanto la opción como su argumento son simples elementos secuenciales en la lista sys.argv. No se hace ningún intento de asociar uno con otro; todo lo que tenemos es una lista. |
Así que como puede ver, ciertamente tenemos toda la información que se nos pasó en la línea de órdenes, pero sin embargo no parece que vaya a ser tan fácil hacer uso de ella. Para programas sencillos que sólo tomen un argumento y no tengan opciones, podemos usar simplemente sys.argv[1] para acceder a él. No hay que avergonzarse de esto; yo mismo lo hago a menudo. Para programas más complejos necesitará el módulo getopt.
def main(argv): grammar = "kant.xml"try: opts, args = getopt.getopt(argv, "hg:d", ["help", "grammar="])
except getopt.GetoptError:
usage()
sys.exit(2) ... if __name__ == "__main__": main(sys.argv[1:])
Así que, ¿qué son todos esos parámetros que le pasamos a la función getopt? Bien, el primero es simplemente la lista sin procesar de opciones y argumentos de la línea de órdenes (sin incluir el primer elemento, el nombre del script, que ya eliminamos antes de llamar a la función main). El segundo es la lista de opciones cortas que acepta el script.
La primera opción y la tercera son autosuficientes; las especificamos o no y hacen cosas (imprimir ayuda) o cambian estados (activar la depuración). Sin embargo, a la segunda opción (-g) debe seguirle un argumento, que es el nombre del fichero de gramática del que hay que leer. De hecho puede ser un nombre de fichero o una dirección web, y aún no sabemos qué (lo averiguaremos luego), pero sabemos que debe ser algo. Se lo decimos a getopt poniendo dos puntos tras g en el segundo parámetro de la función getopt.
Para complicar más las cosas, el script acepta tanto opciones cortas (igual que -h) como opciones largas (igual que --help), y queremos que hagan lo mismo. Para esto es el tercer parámetro de getopt, para especificar una lista de opciones largas que corresponden a las cortas que especificamos en el segundo parámetro.
Aquí hay tres cosas de interés:
¿Sigue confundido? Miremos el código real y veamos si tiene sentido en ese contexto.
def main(argv):grammar = "kant.xml" try: opts, args = getopt.getopt(argv, "hg:d", ["help", "grammar="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts:
if opt in ("-h", "--help"):
usage() sys.exit() elif opt == '-d':
global _debug _debug = 1 elif opt in ("-g", "--grammar"):
grammar = arg source = "".join(args)
k = KantGenerator(grammar, source) print k.output()
<< Creación de manejadores diferentes por tipo de nodo |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Todo junto >> |