La biblioteca estándar de Python tiene módulos para el análisis de archivos de configuración ( configparser ), lectura de variables de entorno ( os.environ ) y análisis de argumentos de línea de comandos ( argparse ). Quiero escribir un programa que haga todo eso, y también:
Tiene una cascada de valores de opciones :
- valores de opción predeterminados, anulados por
- Opciones de archivo de configuración, anulado por
- variables de entorno, anuladas por
- opciones de la línea de comandos.
Permite una o más ubicaciones de archivos de configuración especificadas en la línea de comando con
--config-file foo.conf
, por ejemplo , y las lee (ya sea en lugar de, o adicionalmente, al archivo de configuración habitual). Esto aún debe obedecer a la cascada anterior.Permite definiciones de opciones en un solo lugar para determinar el comportamiento de análisis de los archivos de configuración y la línea de comandos.
Unifica las opciones analizadas en una sola colección de valores de opciones para que el resto del programa acceda sin importar de dónde provienen.
Todo lo que necesito aparentemente está en la biblioteca estándar de Python, pero no funcionan juntos sin problemas.
¿Cómo puedo lograr esto con una desviación mínima de la biblioteca estándar de Python?
jterrace
dado una recompensa aquí para empujarme al límite lo suficiente como para intentar hacer algo como esto :)Respuestas:
El módulo argparse hace que esto no sea una locura, siempre y cuando esté satisfecho con un archivo de configuración que parece una línea de comandos. (Creo que esto es una ventaja, porque los usuarios solo tendrán que aprender una sintaxis). Establecer fromfile_prefix_chars en, por ejemplo
@
, hace que,es equivalente a
si
@baz.conf
es,Incluso puede hacer que su código se busque
foo.conf
automáticamente modificandoargv
El formato de estos archivos de configuración se puede modificar creando una subclase de ArgumentParser y agregando un método convert_arg_line_to_args .
fuente
ACTUALIZACIÓN: finalmente pude poner esto en pypi. Instale la última versión a través de:
Aquí encontrará ayuda e instrucciones completas .
Publicación original
Aquí hay algo que pirateé juntos. No dude en sugerir mejoras / informes de errores en los comentarios:
QUE HACER
Esta implementación aún está incompleta. Aquí hay una lista parcial de TODO:
argparse
maneja los mensajes de errorCumplir con el comportamiento documentado
dest
desdeargs
adentroadd_argument
, en lugar de depender delAction
objetoparse_args
función que useparse_known_args
. (por ejemplo, copiaparse_args
de lacpython
implementación para garantizar las llamadasparse_known_args
).Cosas menos fáciles ...
No he probado nada de esto todavía. Es poco probable, ¡pero aún es posible! Que simplemente funcione ...
section
en el archivo de configuración).section
en el archivo de configuración).fuente
pip install configargparser
Hay una biblioteca que hace exactamente esto llamada configglue .
También admite variables de entorno.
También hay otra biblioteca llamada ConfigArgParse que es
Quizás le interese la charla de PyCon sobre la configuración de ukasz Langa - ¡Déjelos configurar!
fuente
Si bien no lo he probado por mi cuenta, existe la biblioteca ConfigArgParse que indica que hace la mayoría de las cosas que desea:
fuente
Parece que la biblioteca estándar no se ocupa de esto, dejando a cada programador de cantos rodados
configparser
yargparse
yos.environ
todos juntos de una manera torpe.fuente
La biblioteca estándar de Python no proporciona esto, hasta donde yo sé. Resolví esto por mí mismo escribiendo código para usar
optparse
yConfigParser
analizar la línea de comandos y los archivos de configuración, y proporcionar una capa de abstracción sobre ellos. Sin embargo, necesitaría esto como una dependencia separada, que según su comentario anterior parece ser desagradable.Si desea ver el código que escribí, está en http://liw.fi/cliapp/ . Está integrado en mi biblioteca de "marco de aplicación de línea de comandos", ya que eso es una gran parte de lo que debe hacer el marco.
fuente
Probé algo como esto recientemente, usando "optparse".
Lo configuré como una subclase de OptonParser, con un comando '--Store' y '--Check'.
El siguiente código debería tenerlo cubierto. Solo necesita definir sus propios métodos de 'carga' y 'almacenamiento' que aceptan / devuelven diccionarios y ya está listo.
fuente
Para cumplir con todos esos requisitos, recomendaría escribir su propia biblioteca que use tanto [opt | arg] parse como configparser para la funcionalidad subyacente.
Dados los dos primeros y el último requisito, diría que quiere:
Paso uno: Realice una pasada del analizador de línea de comandos que solo busque la opción --config-file.
Paso dos: Analice el archivo de configuración.
Paso tres: configure un segundo paso del analizador de línea de comandos utilizando la salida del paso del archivo de configuración como valores predeterminados.
El tercer requisito probablemente signifique que tiene que diseñar su propio sistema de definición de opciones para exponer toda la funcionalidad de optparse y configparser que le interesan, y escribir algunas conexiones para hacer conversiones intermedias.
fuente
Aquí hay un módulo que pirateé y que lee argumentos de línea de comandos, configuraciones de entorno, archivos ini y valores de llavero. También está disponible en resumen .
fuente
Puede usar ChainMap para esto. Eche un vistazo a mi ejemplo que proporcioné en "¿Cuál es la mejor manera de permitir que las opciones de configuración se anulen en la línea de comandos en Python?" TAN pregunta.
fuente
El confecto de biblioteca que construí es precisamente para satisfacer la mayoría de sus necesidades.
Puede adjuntar opciones de línea de comando a algunos comandos de clic
(lo siento, no es argparse, pero hacer clic es mejor y mucho más avanzado.
confect
Podría admitir argparse en la versión futura).confect
carga archivos de configuración de Python, no JSON / YMAL / TOML / INI. Al igual que el archivo de perfil de IPython o el archivo de configuración DJANGO, el archivo de configuración de Python es flexible y más fácil de mantener.Para obtener más información, consulte README.rst en el repositorio del proyecto . Tenga en cuenta que solo admite Python3.6 hasta.
Ejemplos
Adjuntar opciones de línea de comando
Crea automáticamente un mensaje de ayuda completo con todas las propiedades y valores predeterminados declarados.
Cargando variables de entorno
Solo necesita una línea para cargar variables de entorno
fuente