在Python中放置configuration文件的位置?

在开发模式下,我有以下目录树:

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

我使用ConfigParser来parsingmyproject.conf文件。

在我的代码中,很容易用一个好的path加载文件: my_project/conf/myproject.conf

问题是:当我使用setup.py安装我的项目时,configuration文件(位于setup.py)位于/etc/my_project/myproject.conf ,我的应用程序位于/usr/lib/python<version>/site-packages/my_project/

如何在“生产”模式下将my_project/conf/myproject.conf文件引用到我的项目中,并在“devel”模式下引用本地文件( my_project/conf/myproject.conf )。

另外,如果可能的话,我希望是可移植的(例如在Windows上工作)。

有什么好的做法呢?

你看过configuration文件是如何工作的吗? 阅读“rc”文件,有时称为它们。 “bashrc”,“vimrc”等

通常有一个多步骤的searchconfiguration文件。

  1. 本地目录。 ./myproject.conf

  2. 用户的主目录( ~user/myproject.conf

  3. 一个标准的系统范围目录( /etc/myproject/myproject.conf

  4. 由环境variables( MYPROJECT_CONF )命名的地方

Python安装将是最后看的地方。

 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 

如果您使用的是setuptools ,请参阅关于使用非包数据文件的章节。 不要试图自己查找文件。

appdirs包在寻找各种平台上已安装应用程序的标准位置方面做得很好。 我想知道是否扩展它来发现或允许开发人员的某种“卸载”状态是有道理的。

我不认为有一个干净的方式来处理这个问题。 您可以简单地selecttesting“本地”文件的存在,这将在开发模式下工作。 否则,回退到生产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 

另一个select是将所有.cfg.ini文件保存在主目录中,如“boto”。

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