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?
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.
Annuaire local. ./myproject.conf
.
Répertoire personnel de l'utilisateur (~user/myproject.conf
)
Un répertoire standard à l'échelle du système (/etc/myproject/myproject.conf
)
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
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.
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.
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')
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