Originalmente soy un programador C. He visto numerosos trucos y "hacks" para leer muchos argumentos diferentes.
¿Cuáles son algunas de las formas en que los programadores de Python pueden hacer esto?
Relacionado
- ¿Cuál es la mejor manera de agarrar / analizar argumentos de línea de comandos pasados a un script Python?
- ¿Implementando una interfaz de línea de comandos de estilo “[comando] [acción] [parámetro]”?
- ¿Cómo puedo procesar argumentos de línea de comandos en Python?
- ¿Cómo formateo la ayuda del argumento posicional usando el optparse de Python?
python
command-line
command-line-arguments
Martineau
fuente
fuente
Respuestas:
La solución canónica en la biblioteca estándar es
argparse
( docs ):Aquí hay un ejemplo:
argparse
soportes (entre otras cosas):fuente
optparse
está en desuso, el autor de la pregunta ya no es miembro del desbordamiento de la pila, y esta es la respuesta aceptada en una pregunta muy visible; considere reescribir completamente su código de ejemplo para utilizar stdlibargparse
.sys.argv
es una lista que contiene todos los argumentos pasados al script en la línea de comando.Básicamente,
fuente
sys.argv[1:]
(evita el nombre del script).Simplemente dando vueltas evangelizando por argparse, lo cual es mejor por estas razones ... esencialmente:
(copiado del enlace)
El módulo argparse puede manejar argumentos posicionales y opcionales, mientras que optparse solo puede manejar argumentos opcionales
argparse no es dogmático sobre el aspecto que debería tener su interfaz de línea de comandos: se admiten opciones como -file o / file, al igual que las opciones requeridas. Optparse se niega a admitir estas características, prefiriendo la pureza sobre la practicidad
argparse produce mensajes de uso más informativos, incluido el uso de línea de comandos determinado a partir de sus argumentos, y mensajes de ayuda para argumentos posicionales y opcionales. El módulo optparse requiere que escriba su propia cadena de uso, y no tiene forma de mostrar ayuda para argumentos posicionales.
argparse admite acciones que consumen un número variable de argumentos de línea de comandos, mientras que optparse requiere que se conozca de antemano el número exacto de argumentos (por ejemplo, 1, 2 o 3)
argparse admite analizadores que se envían a subcomandos, mientras que optparse requiere configurar
allow_interspersed_args
y realizar el envío de analizador manualmenteY mi favorito personal:
add_argument()
se especifiquen con cálculos simples, mientras que optparse requiere la piratería de atributos de clase comoSTORE_ACTIONS
oCHECK_METHODS
para obtener una verificación de argumento adecuadafuente
-f
o--foo
, mientras que "se conoce de antemano el número exacto de argumentos" presumiblemente significa argumentos posicionales dados sin ningún indicador de opción anterior.También hay
argparse
un módulo stdlib (una "mejora" en eloptparse
módulo stdlib ). Ejemplo de la introducción a argparse :Uso:
fuente
Una forma de hacerlo es usando
sys.argv
. Esto imprimirá el nombre del script como primer argumento y todos los demás parámetros que le pase.fuente
La biblioteca docopt es realmente elegante. Construye un argumento dict a partir de la cadena de uso para su aplicación.
Por ejemplo, del archivo Léame de docopt:
fuente
Si necesitas algo rápido y no muy flexible
main.py:
Entonces corre
python main.py James Smith
para producir el siguiente resultado:
fuente
python main.py "James Smith"
que poneJames Smith
ensys.argv[1]
y produce unaIndexError
cuando intenta utilizar la inexistentesys.argv[2]
. El comportamiento de las citas dependerá un poco de la plataforma y el shell desde el que ejecute Python.python main.py "James Joseph Smith"
? Si le preocupa el índice fuera de los límites, puede agregar una verificación para la cantidad de argumentos proporcionados. Menos realista o no, mi ejemplo muestra cómo manejar múltiples argumentos.gmail-trash-msg.py MessageID
. Esta respuesta es directa alMessageID
parámetro de prueba que se ha pasadosys.argv[1]
.fuente
Yo mismo uso optparse, pero me gusta mucho la dirección que está tomando Simon Willison con su biblioteca optfunc recientemente presentada . Funciona por:
Entonces, por ejemplo, esta definición de función:
se convierte en este texto de ayuda de optparse:
fuente
Me gusta getopt de stdlib, por ejemplo:
Últimamente he estado envolviendo algo similar a esto para hacer las cosas menos detalladas (por ejemplo, hacer "-h" implícito).
fuente
El clic de Pocoo es más intuitivo, requiere menos repetitivo y es al menos tan poderoso como argparse.
La única debilidad que he encontrado hasta ahora es que no se puede hacer mucha personalización para ayudar a las páginas, pero eso generalmente no es un requisito y docopt parece ser la opción clara cuando lo es.
fuente
Como puede ver optparse "El módulo optparse está en desuso y no se desarrollará más; el desarrollo continuará con el módulo argparse ".
fuente
fuente
Puede que le interese un pequeño módulo de Python que escribí para facilitar aún más el manejo de los argumentos de la línea de comandos (código abierto y uso gratuito) - Comando
fuente
Recomiendo mirar docopt como una alternativa simple a estos otros.
docopt es un nuevo proyecto que funciona analizando su mensaje de ayuda en lugar de requerir que implemente todo usted mismo. Solo tiene que poner su mensaje de uso en el formato POSIX.
fuente
Otra opción más es argh . Se basa en argparse y te permite escribir cosas como:
Generará automáticamente ayuda, etc., y puede usar decoradores para proporcionar orientación adicional sobre cómo debería funcionar el análisis de argumentos.
fuente
argh
es más fácil que otras bibliotecas o usarsys
.argh
pero no es particularmente adecuado para escenarios en los que su mayor deseo es no tener un comando con subcomandos.def frobnicate_spleches(...)
definir una función que haga lo que haga su script y luego lo hagaif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
al final del archivo.Mi solución es entrypoint2 . Ejemplo:
texto de ayuda:
fuente