2011-09-27 28 views
43

En el modo de desarrollo, tengo el siguiente árbol de directorios:¿Dónde poner un archivo de configuración en Python?

| 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, que es fácil de cargar el archivo con un buen camino: my_project/conf/myproject.conf

El problema es: Al instalar mi proyecto mediante el setup.py, el archivo de configuración se encuentran (gracias a setup.py) en el /etc/my_project/myproject.conf y mi aplicación en el /usr/lib/python<version>/site-packages/my_project/.

¿Cómo puedo hacer referencia a mi archivo my_project/conf/myproject.conf en mi proyecto en modo "producción", y consulte el 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?

Respuesta

32

¿Ha 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 en varios pasos para el archivo de configuración.

  1. Directorio local. ./myproject.conf.

  2. el directorio personal del usuario (~user/myproject.conf)

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

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

instalación El Python sería el último lugar para mirar.

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 
+2

No es así como funciona en Windows, sin embargo, cuál es la pregunta. – endolith

+1

Esto "Trabajará en Windows".Puede que no sea "típico" para Windows, pero ciertamente funciona. –

+1

Uh - ¿por qué tienes un intento de capturar una declaración? – David

1

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 
9

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.

2

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

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