La documentación para el módulo argparse python , aunque excelente, estoy seguro, es demasiado para mi pequeño cerebro principiante en este momento. No necesito hacer cálculos matemáticos en la línea de comando o entrometerme con las líneas de formato en la pantalla o cambiar los caracteres de opción. Todo lo que quiero hacer es "Si arg es A, haz esto, si B hace eso, si ninguno de los anteriores muestra ayuda y renuncia" .
529

sys.argvel argumento que desea ...Respuestas:
Mi comprensión de la pregunta original es doble. Primero, en términos del ejemplo argparse más simple posible, me sorprende que no lo haya visto aquí. Por supuesto, para ser absolutamente simple, también es todo sobrecarga con poca potencia, pero podría ayudarlo a comenzar.
Pero ahora se requiere este argumento posicional. Si lo omite al invocar este programa, recibirá un error sobre la falta de argumentos. Esto me lleva a la segunda parte de la pregunta original. Matt Wilkie parece querer un único argumento opcional sin una etiqueta con nombre (las etiquetas de opción). Mi sugerencia sería modificar el código anterior de la siguiente manera:
Puede haber una solución más elegante, pero esto funciona y es minimalista.
fuente
Así es como lo hago
argparse(con múltiples argumentos):argsserá un diccionario que contenga los argumentos:En su caso, simplemente agregue un solo argumento.
fuente
foo.py --action installofoo.py --action removeno simplementefoo.py installparser.add_argument('install', help='Install the app')(Observe que no puede definir un argumento posicional conrequired=True)argsse generó el dict como se indicó anteriormente.args.fooy enargs.barlugar de la sintaxis del diccionario. De cualquier manera, está bien, por supuesto, pero args no es en realidad un diccionario sino unargparse.Namespaceobjeto.La
argparsedocumentación es razonablemente buena, pero deja de lado algunos detalles útiles que podrían no ser obvios. (@Diego Navarro ya mencionó algo de esto, pero trataré de ampliar un poco su respuesta). El uso básico es el siguiente:El objeto del que regresa
parse_args()es un objeto 'Espacio de nombres': un objeto cuyas variables miembro se nombran después de sus argumentos de línea de comandos. ElNamespaceobjeto es cómo accede a sus argumentos y los valores asociados con ellos:(Tenga en cuenta que
argparsereemplaza '-' en los nombres de sus argumentos con guiones bajos al nombrar las variables).En muchas situaciones, es posible que desee utilizar argumentos simplemente como indicadores que no tienen ningún valor. Puede agregarlos en argparse de esta manera:
Lo anterior creará variables llamadas 'foo' con valor True y 'no_foo' con valor False, respectivamente:
Tenga en cuenta también que puede usar la opción "requerida" al agregar un argumento:
De esa manera, si omite este argumento en la línea de comando,
argparsele dirá que falta y detendrá la ejecución de su script.Finalmente, tenga en cuenta que es posible crear una estructura dict de sus argumentos utilizando la
varsfunción, si eso le facilita la vida.Como puede ver,
varsdevuelve un dict con sus nombres de argumentos como claves y sus valores como, er, valores.Hay muchas otras opciones y cosas que puede hacer, pero esto debería cubrir los escenarios de uso más esenciales y comunes.
fuente
'-f'y'-b'? ¿Por qué no puedes omitir esto?man cpoman lsy encontrarás que muchas opciones vienen en ambos sabores (por ejemplo-f, --force). Probablemente hay razones muy diversas por las cuales las personas prefieren uno u otro, pero en cualquier caso es bastante estándar hacer que ambos formularios estén disponibles en su programa.Matt pregunta acerca de los parámetros posicionales en argparse, y estoy de acuerdo en que falta la documentación de Python sobre este aspecto. No hay un solo ejemplo completo en las ~ 20 páginas impares que muestre tanto el análisis como el uso de parámetros posicionales .
Ninguna de las otras respuestas aquí muestra un ejemplo completo de parámetros posicionales, así que aquí hay un ejemplo completo:
Lo que me desconcertó es que argparse convertirá el argumento nombrado "--foo-bar" en "foo_bar", pero un parámetro posicional llamado "foo-bar" permanece como "foo-bar", lo que hace que sea menos obvio cómo úsalo en tu programa.
Observe las dos líneas cerca del final de mi ejemplo: ninguna de ellas funcionará para obtener el valor del parámetro posicional foo-bar. La primera es obviamente incorrecta (es una expresión aritmética args.foo menos barra), pero la segunda tampoco funciona:
Si desea usar el
foo-baratributo, debe usargetattr, como se ve en la última línea de mi ejemplo. Lo loco es que si intentas usardest=foo_barpara cambiar el nombre de la propiedad a algo que sea más fácil de acceder, obtendrás un mensaje de error realmente extraño:Así es como se ejecuta el ejemplo anterior:
fuente
nargs='?'es el conjuro para un "posicional opcional" según stackoverflow.com/questions/4480075/…foo-barno se transformafoo_barse aborda en bugs.python.org/issue15125 .print args.foo_barfunciona. Dado que es un argumento posicional, no tiene que especificar el nombre al llamar al script, por lo que no importa para el usuario.getattr(también es más flexible, ya que le permite cambiar un argumento de opcional a posicional sin tener que cambiar el código que usa el valor).Otra introducción sumaria, inspirada en esta publicación .
Los argumentos se definen con combinaciones de lo siguiente:
Las opciones comunes son:
--helpse usa.floatoint(de lo contrario esstr).'-x', '--long-name', dest='longName').Nota: por defecto
--long-namese accede conargs.long_namestore_true, store_false: para argumentos booleanos'--foo', action='store_true' => args.foo == Truestore_const: para ser usado con la opciónconst'--foo', action='store_const', const=42 => args.foo == 42count: para opciones repetidas, como en./myscript.py -vv'-v', action='count' => args.v == 2append: para opciones repetidas, como en./myscript.py --foo 1 --foo 2'--foo', action='append' => args.foo == ['1', '2']./myscript.py --foo a b => args.foo = ['a', 'b']type=int).fuente
Tenga en cuenta el Tutorial de Argparse en Python HOWTOs . Comienza con la mayoría de los ejemplos básicos, como este:
y progresa a los menos básicos.
Hay un ejemplo con una opción predefinida para una opción, como lo que se pide:
fuente
Esto es lo que se me ocurrió en mi proyecto de aprendizaje gracias principalmente a @DMH ...
Código de demostración:
Esto puede haber evolucionado y está disponible en línea: command-line.py
Script para darle entrenamiento a este código: command-line-demo.sh
fuente
También podrías usar plac (un envoltorio alrededor
argparse).Como beneficio adicional, genera buenas instrucciones de ayuda: consulte a continuación.
Script de ejemplo:
Salida de ejemplo:
No se proporcionaron argumentos -
example.py:Argumento inesperado proporcionado
example.py C:Argumento correcto proporcionado -
example.py A:Menú de ayuda completo (generado automáticamente) -
example.py -h:Breve explicación:
El nombre del argumento generalmente es igual al nombre del parámetro (
arg).La anotación de tupla después del
argparámetro tiene el siguiente significado:Argument with two possible values)positional)None)None)['A', 'B'])Documentación:
Para obtener más información sobre el uso de plac, consulte su excelente documentación:
fuente
Para agregar a lo que otros han declarado:
Por lo general, me gusta usar el parámetro 'dest' para especificar un nombre de variable y luego usar 'globals (). Update ()' para poner esas variables en el espacio de nombres global.
Uso:
Código:
fuente
argparseUtiliza internamentegetattrysetattrpara acceder a valores en el espacio de nombres. De esa manera no le molestan losdestvalores formados de manera extraña .Una forma realmente simple de usar argparse y modificar los modificadores '-h' / '--help' para mostrar sus propias instrucciones de ayuda de código personal es establecer la ayuda predeterminada en False, también puede agregar tantos .add_arguments adicionales como desee :
Ejecute: python test.py -h
Salida:
fuente
La respuesta más simple!
PD: el que escribió el documento de argparse es tonto
código de python:
código de ejecución
fuente