2010-01-08 12 views
14

J'utilise ConfigParser pour configurer mon application, et maintenant je veux la rendre facilement distribuable, tout en préservant la configurabilité. Je pense que j'ai besoin d'un répertoire avec des modèles de fichier de configuration, et un moyen de générer la configuration à utiliser réellement à partir de ceux-ci. Ensuite, j'ai besoin d'un emplacement pour le stocker dans virtualenv, le répertoire personnel des utilisateurs, etc. Je veux qu'il soit aussi proche du fonctionnement normal des paquets Unix, c'est-à-dire avoir une configuration dans etc, mais avec des remplacements dans le répertoire personnel. Y at-il une solution ready-made pour cela, et si non, que dois-je mettre dans mon setup.py etc pour le faire fonctionner comme je le veux?Empaquetage des applications Python avec des fichiers de configuration

Répondre

9

vous pouvez utiliser l'option data_files de distutils pour installer les fichiers où vous le souhaitez.

data_files spécifie une séquence de (directory, files) paires de la manière suivante:

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

Lors de la lecture du fichier de configuration sur votre application, vous pouvez fusionner une version /home si elle existe, en utilisant .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 

Cela va lire /etc/config1.ini, puis remplacer les définitions par des éléments provenant de .config1.ini dans le répertoire personnel de l'utilisateur, s'il existe.

+6

Existe-t-il un moyen de rendre ce travail agréable avec virtualenv? C'est à dire. quel chemin dois-je spécifier pour mettre des choses dans myvirtenv/etc/myconf.ini? –

+4

Je sais que c'est un vieux message, mais peut toujours être utile. @JoakimLundborg: vous pouvez utiliser '' sys.prefix'', qui est par défaut ''/usr'', et le chemin de votre virtualenv dans votre cas (avec le vrai préfixe dans '' sys.real_prefix'' – linkdd

+0

Utiliser sys .real_prefix semble très prometteur, il faudrait aussi un moyen d'obtenir le même emplacement à l'exécution pour lire le fichier de configuration à partir de là, peut-il être utilisé à cette fin? – a1an