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.
Directorio local
./myproject.conf
.Directorio de inicio del usuario (
~user/myproject.conf
)Un directorio estándar de todo el sistema (
/etc/myproject/myproject.conf
)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'')
Si está utilizando setuptools
, consulte el capítulo sobre el uso de archivos de datos que no son de paquete . No intente buscar los archivos usted mismo.