¿Cuál es el método o biblioteca más fácil , tersest y más flexible para analizar los argumentos de la línea de comandos de Python?
¿Cuál es el método o biblioteca más fácil , tersest y más flexible para analizar los argumentos de la línea de comandos de Python?
Esta respuesta sugiere optparse
cuál es apropiado para versiones anteriores de Python. Para Python 2.7 y superior, argparse
reemplaza optparse
. Vea esta respuesta para más información.
Como otras personas señalaron, es mejor optar por optparse sobre getopt. getopt es más o menos un mapeo uno a uno de las funciones estándar de la biblioteca getopt (3) C, y no es muy fácil de usar.
optparse, aunque es un poco más detallado, está mucho mejor estructurado y es más fácil de extender más adelante.
Aquí hay una línea típica para agregar una opción a su analizador:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
Más o menos habla por sí mismo; en el momento del procesamiento, aceptará -q o --query como opciones, almacenará el argumento en un atributo llamado query y tiene un valor predeterminado si no lo especifica. También se documenta automáticamente al declarar el argumento de ayuda (que se usará cuando se ejecute con -h / - help) allí mismo con la opción.
Por lo general, analiza sus argumentos con:
options, args = parser.parse_args()
Esto, de forma predeterminada, analizará los argumentos estándar pasados al script (sys.argv [1:])
options.query se establecerá en el valor que le pasó al script.
Usted crea un analizador simplemente haciendo
parser = optparse.OptionParser()
Estos son todos los elementos básicos que necesita. Aquí hay un script completo de Python que muestra esto:
import optparse
parser = optparse.OptionParser()
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
options, args = parser.parse_args()
print 'Query string:', options.query
5 líneas de python que te muestran los conceptos básicos.
Guárdelo en sample.py y ejecútelo una vez con
python sample.py
y una vez con
python sample.py --query myquery
Más allá de eso, encontrará que optparse es muy fácil de extender. En uno de mis proyectos, creé una clase de Comando que le permite anidar subcomandos en un árbol de comandos fácilmente. Utiliza optparse en gran medida para encadenar comandos juntos. No es algo que pueda explicar fácilmente en unas pocas líneas, pero siéntase libre de navegar en mi repositorio para la clase principal, así como una clase que lo use y el analizador de opciones
-mcProfile -o program.prof
pero agrparcer está capturando estos args, ¿cómo paso estos args a python exe?argparse
es el camino a seguir Aquí hay un breve resumen de cómo usarlo:1) Inicializar
2) Agregar argumentos
3) Parse
4) Acceso
5) Comprobar valores
Uso
Uso correcto:
Argumentos incorrectos:
Ayuda completa:
fuente
Usando docopt
Desde 2012 hay un módulo muy fácil, poderoso y realmente genial para analizar argumentos llamado docopt . Aquí hay un ejemplo tomado de su documentación:
Así que esto es todo: 2 líneas de código más su cadena de documentación, que es esencial y obtiene sus argumentos analizados y disponibles en su objeto de argumentos.
Usando fuego de pitón
Desde 2017 hay otro módulo genial llamado python-fire . Puede generar una interfaz CLI para su código con un análisis cero de argumentos. Aquí hay un ejemplo simple de la documentación (este pequeño programa expone la función
double
a la línea de comando):Desde la línea de comandos, puede ejecutar:
fuente
La nueva forma moderna es
argparse
por estas razones. argparse> optparse> getoptactualización: a partir de py2.7 argparse es parte de la biblioteca estándar y optparse está en desuso.
fuente
Prefiero Click . Resume las opciones de gestión y permite "(...) crear hermosas interfaces de línea de comandos de una manera componible con el mínimo código necesario".
Aquí hay un ejemplo de uso:
También genera automáticamente páginas de ayuda bien formateadas:
fuente
Casi todo el mundo está usando getopt
Aquí está el código de ejemplo para el documento:
En una palabra, así es como funciona.
Tienes dos tipos de opciones. Aquellos que reciben argumentos y aquellos que son como interruptores.
sys.argv
es más o menos tuchar** argv
en C. Al igual que en C omites el primer elemento que es el nombre de tu programa y solo analizas los argumentos:sys.argv[1:]
Getopt.getopt
lo analizará de acuerdo con la regla que proporcione en el argumento."ho:v"
Aquí se describen los argumentos cortos:-ONELETTER
. El:
medio que-o
acepta un argumento.Finalmente
["help", "output="]
describe argumentos largos (--MORETHANONELETTER
). La=
salida posterior una vez más significa que la salida acepta uno de los argumentos.El resultado es una lista de pareja (opción, argumento)
Si una opción no acepta ningún argumento (como
--help
aquí), laarg
parte es una cadena vacía. Por lo general, desea hacer un bucle en esta lista y probar el nombre de la opción como en el ejemplo.espero que esto te ayude.
fuente
getopt
las versiones más recientes de Python, esta respuesta se ha quedado obsoleta.getopt
todavía no está en desuso ... Pero su documentación indica que se proporciona principalmente a usuarios familiarizados con lagetopt()
función C , y reconoce que para otros usuariosargparse
podría ser una mejor solución, permitiendo "escribir menos código y obtener mejor ayuda y mensajes de error ".Uso
optparse
que viene con la biblioteca estándar. Por ejemplo:Fuente: uso de Python para crear herramientas de línea de comandos de UNIX
Sin embargo, a partir de Python 2.7, optparse está en desuso, vea: ¿Por qué usar argparse en lugar de optparse?
fuente
En caso de que necesite hacerlo, esto puede ayudar si necesita obtener argumentos unicode en Win32 (2K, XP, etc.):
fuente
Valores predeterminados de argumento de línea de comando ligero
Aunque
argparse
es excelente y es la respuesta correcta para los cambios de línea de comandos completamente documentados y las características avanzadas, puede usar los valores predeterminados de los argumentos de funciones para manejar argumentos de posición directos de manera muy simple.El argumento 'nombre' captura el nombre del script y no se usa. La salida de prueba se ve así:
Para scripts simples donde solo quiero algunos valores predeterminados, esto me parece bastante suficiente. También es posible que desee incluir algún tipo de coerción en los valores de retorno o los valores de la línea de comandos serán todos cadenas.
fuente
Prefiero optparse a getopt. Es muy declarativo: le dices los nombres de las opciones y los efectos que deberían tener (por ejemplo, establecer un campo booleano), y te devuelve un diccionario poblado de acuerdo con tus especificaciones.
http://docs.python.org/lib/module-optparse.html
fuente
Creo que la mejor manera para proyectos más grandes es optparse, pero si está buscando una manera fácil, tal vez http://werkzeug.pocoo.org/documentation/script sea algo para usted.
Entonces, básicamente, cada función action_ * está expuesta a la línea de comando y se genera un buen mensaje de ayuda de forma gratuita.
fuente
declarative_parser
. Por supuesto, si uno está trabajando con werkzeug, puede ser mejor mantener elwerkzung.script
. De todos modos, soy un gran admirador de ese enfoque.¡El código Argparse puede ser más largo que el código de implementación real!
Ese es un problema que encuentro con las opciones de análisis de argumentos más populares es que si sus parámetros son solo modestos, el código para documentarlos se vuelve desproporcionadamente grande para el beneficio que proporcionan.
Un relativo nuevo en la escena de análisis de argumentos (creo) es plac .
Hace algunas compensaciones reconocidas con argparse, pero usa documentación en línea y se ajusta simplemente alrededor de la
main()
función de función de tipo:fuente
Consoleargs merece ser mencionado aquí. Es muy fácil de usar. Echale un vistazo:
Ahora en la consola:
fuente
Aquí hay un método, no una biblioteca, que parece funcionar para mí.
Los objetivos aquí deben ser concisos, cada argumento analizado por una sola línea, los argumentos se alinean para facilitar la lectura, el código es simple y no depende de ningún módulo especial (solo os + sys), advierte sobre argumentos faltantes o desconocidos con gracia , utiliza un bucle simple para / range () y funciona en python 2.xy 3.x
Se muestran dos indicadores de alternancia (-d, -v) y dos valores controlados por argumentos (-i xxx y -o xxx).
El objetivo de NextArg () es devolver el siguiente argumento mientras se comprueban los datos faltantes, y 'omitir' omite el bucle cuando se utiliza NextArg (), manteniendo el análisis de la bandera en uno.
fuente
Extendí el enfoque de Erco para permitir los argumentos posicionales requeridos y los argumentos opcionales. Deben preceder a los argumentos -d, -v, etc.
Los argumentos posicionales y opcionales se pueden recuperar con PosArg (i) y OptArg (i, predeterminado) respectivamente. Cuando se encuentra un argumento opcional, la posición de inicio de búsqueda de opciones (por ejemplo, -i) se mueve 1 hacia adelante para evitar causar una muerte 'inesperada'.
fuente