2010-01-08 21 views
14

Estoy usando ConfigParser para configurar mi aplicación, y ahora quiero que sea fácilmente distribuible, y al mismo tiempo conservar la capacidad de configuración.Aplicaciones de empaquetado de Python con archivos de configuración

Estoy pensando que necesito un directorio con plantillas de archivos de configuración, y alguna forma de generar la configuración para usar realmente de estos. Entonces necesito un lugar para almacenarlo que funcione en virtualenv, el directorio de inicio de los usuarios, etc. Quiero que sea lo más parecido a cómo funcionan los paquetes Unix normales, es decir, tienen config en etc, pero con anulaciones en el directorio de inicio. ¿Existe una solución lista para esto, y si no, qué debo poner en mi setup.py etc. para que funcione como yo quiero?

Respuesta

9

puede usar la opción data_files de distutils para instalar archivos donde desee.

data_files especifica una secuencia de (directory, files) pares de la siguiente manera:

setup(..., 
     data_files=[('/etc', ['cfg/config1.ini', 'cfg/config2.ini']), 
        ('/etc/init.d', ['bin/initscript1'])], 
     .... 
    ) 

Al leer el archivo de configuración de su aplicación, se puede combinar una versión /home si existe, utilizando .read() method of ConfigParser objects:

files_read = cfgparserobj.read(['/etc/config1.ini', 
           os.path.expanduser('~/.config1.ini')]) 
for fname in files_read: 
    print "Reading config from", fname 

que leerá /etc/config1.ini y luego sobrescribirá las definiciones con cosas provenientes de .config1.ini en el directorio de inicio del usuario, si existe.

+6

¿Hay alguna manera de que esto funcione bien con virtualenv? Es decir. ¿Qué camino debo especificar para poner cosas en myvirtenv/etc/myconf.ini? –

+4

Sé que esta es una publicación anterior, pero aún puede ser útil. @JoakimLundborg: puede usar '' sys.prefix'', que es por defecto ''/usr'', y la ruta de su virtualenv en su caso (con el prefijo real en '' sys.real_prefix'' – linkdd

+0

Usando sys .real_prefix parece muy prometedor, también requeriría una forma de obtener la misma ubicación en tiempo de ejecución para leer el archivo de configuración desde allí; ¿se puede usar el mismo para ese fin? – a1an

Cuestiones relacionadas