write management files example descargar python pythonpath configparser

management - load json config python



Dónde poner un archivo de configuración en Python? (5)

En el modo de desarrollo, tengo el siguiente árbol de directorios:

| my_project/ | setup.py | my_project/ | __init__.py | main.py | conf/ | myproject.conf

Utilizo ConfigParser para analizar el archivo myproject.conf .

En mi código, es fácil cargar el archivo con una buena ruta: my_project/conf/myproject.conf

El problema es: cuando instalo mi proyecto usando setup.py, el archivo de configuración está situado (gracias a setup.py) en el /etc/my_project/myproject.conf y mi aplicación en la /usr/lib/python<version>/site-packages/my_project/ .

¿Cómo puedo hacer referencia a mi my_project/conf/myproject.conf en mi proyecto en modo "producción", y hacer referencia al archivo local ( my_project/conf/myproject.conf ) en el modo "desarrollo".

Además, me gustaría ser portátil si es posible (trabajo en Windows, por ejemplo).

¿Cuál es la buena práctica para hacer eso?


¿Has visto cómo funcionan los archivos de configuración? Lea en los archivos "rc", como a veces se les llama. "bashrc", "vimrc", etc.

Generalmente hay una búsqueda de varios pasos para el archivo de configuración.

  1. Directorio local ./myproject.conf .

  2. Directorio de inicio del usuario ( ~user/myproject.conf )

  3. Un directorio estándar de todo el sistema ( /etc/myproject/myproject.conf )

  4. Un lugar nombrado por una variable de entorno ( MYPROJECT_CONF )

La instalación de Python sería el último lugar para buscar.

config= None for loc in os.curdir, os.path.expanduser("~"), "/etc/myproject", os.environ.get("MYPROJECT_CONF"): try: with open(os.path.join(loc,"myproject.conf")) as source: config.readfp( source ) except IOError: pass


El paquete appdirs hace un buen trabajo al encontrar el lugar estándar para las aplicaciones instaladas en varias plataformas. Me pregunto si extenderlo para descubrir o permitir algún tipo de estado "desinstalado" para los desarrolladores tendría sentido.


No creo que haya una manera limpia de lidiar con eso. Simplemente puede optar por probar la existencia del archivo ''local'', que funcionaría en modo dev. De lo contrario, vuelva a la ruta de producción:

main_base = os.path.dirname(__file__) config_file = os.path.join([main_base, "conf", "myproject.conf"]) if not os.path.exists(config_file): config_file = PROD_CONFIG_FILE # this could also be different based on the OS


Otra opción es mantener todos los archivos .cfg y .ini en el directorio de inicio, como lo hace ''boto''.

import os.path config_file = os.path.join(os.path.expanduser("~"), ''.myproject'')