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.argv
el 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):args
será un diccionario que contenga los argumentos:En su caso, simplemente agregue un solo argumento.
fuente
foo.py --action install
ofoo.py --action remove
no simplementefoo.py install
parser.add_argument('install', help='Install the app')
(Observe que no puede definir un argumento posicional conrequired=True
)args
se generó el dict como se indicó anteriormente.args.foo
y enargs.bar
lugar de la sintaxis del diccionario. De cualquier manera, está bien, por supuesto, pero args no es en realidad un diccionario sino unargparse.Namespace
objeto.La
argparse
documentació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. ElNamespace
objeto es cómo accede a sus argumentos y los valores asociados con ellos:(Tenga en cuenta que
argparse
reemplaza '-' 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,
argparse
le 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
vars
función, si eso le facilita la vida.Como puede ver,
vars
devuelve 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 cp
oman ls
y 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-bar
atributo, debe usargetattr
, como se ve en la última línea de mi ejemplo. Lo loco es que si intentas usardest=foo_bar
para 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-bar
no se transformafoo_bar
se aborda en bugs.python.org/issue15125 .print args.foo_bar
funciona. 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:
--help
se usa.float
oint
(de lo contrario esstr
).'-x', '--long-name', dest='longName'
).Nota: por defecto
--long-name
se accede conargs.long_name
store_true, store_false
: para argumentos booleanos'--foo', action='store_true' => args.foo == True
store_const
: para ser usado con la opciónconst
'--foo', action='store_const', const=42 => args.foo == 42
count
: para opciones repetidas, como en./myscript.py -vv
'-v', action='count' => args.v == 2
append
: 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
arg
pará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
argparse
Utiliza internamentegetattr
ysetattr
para acceder a valores en el espacio de nombres. De esa manera no le molestan losdest
valores 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