web-dev-qa-db-fra.com

Où mettre un fichier de configuration en Python?

En mode développement, j'ai l'arborescence de répertoires suivante:

| my_project/
| setup.py
| my_project/
    | __init__.py
    | main.py
    | conf/
        | myproject.conf

J'utilise ConfigParser pour analyser le myproject.conf fichier.

Dans mon code, il est facile de charger le fichier avec un bon chemin: my_project/conf/myproject.conf

Le problème est: lorsque j'installe mon projet à l'aide de setup.py, le fichier de configuration se trouve (grâce à setup.py) dans le /etc/my_project/myproject.conf et ma candidature dans le /usr/lib/python<version>/site-packages/my_project/.

Comment puis-je référer mon my_project/conf/myproject.conf fichier dans mon projet en mode "production", et référez-vous au fichier local (my_project/conf/myproject.conf) en mode "développement".

De plus, j'aimerais être portable si possible (travail sur windows par exemple).

Quelle est la bonne pratique pour le faire?

53
Sandro Munda

Avez-vous vu comment fonctionnent les fichiers de configuration? Lisez les fichiers "rc", comme on les appelle parfois. "bashrc", "vimrc", etc.

Il y a généralement une recherche en plusieurs étapes pour le fichier de configuration.

  1. Annuaire local. ./myproject.conf.

  2. Répertoire personnel de l'utilisateur (~user/myproject.conf)

  3. Un répertoire standard à l'échelle du système (/etc/myproject/myproject.conf)

  4. Un endroit nommé par une variable d'environnement (MYPROJECT_CONF)

L'installation Python serait le dernier endroit à regarder.

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
37
S.Lott

Le paquet appdirs fait un bon travail pour trouver la place standard pour les applications installées sur diverses plates-formes. Je me demande si l'étendre pour découvrir ou autoriser une sorte de statut "désinstallé" pour les développeurs aurait du sens.

15
nealmcb

Si vous utilisez setuptools, consultez le chapitre sur en utilisant des fichiers de données non-package . N'essayez pas de rechercher les fichiers vous-même.

14
patrys

Une autre option consiste à conserver tous les .cfg et .ini fichiers dans le répertoire personnel, comme le fait "boto".

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

Je ne pense pas qu'il y ait une façon propre de gérer cela. Vous pouvez simplement choisir de tester l'existence du fichier "local", qui fonctionnerait en mode dev. Sinon, revenez au chemin de production:

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
1
Rodrigue