¿Dónde poner un archivo de configuración en Python?

En 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 con setup.py, el archivo de configuración se encuentra (gracias a setup.py) en /etc/my_project/myproject.conf y mi aplicación en /usr/lib/python/site-packages/my_project/ .

¿Cómo puedo referir mi my_project/conf/myproject.conf en mi proyecto en modo “producción”, y referirme al archivo local ( my_project/conf/myproject.conf ) en modo “devel”.

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

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

¿Has visto cómo funcionan los archivos de configuración? Lea sobre 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 

Si está utilizando setuptools , consulte el capítulo sobre el uso de archivos de datos que no son paquetes . No intente buscar los archivos usted mismo.

El paquete de aplicaciones hace un buen trabajo al encontrar el lugar estándar para las aplicaciones instaladas en varias plataformas. Me pregunto si sería lógico extenderlo para descubrir o permitir algún tipo de estado “desinstalado” para los desarrolladores.

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

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

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

 import os.path 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