在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文件。
-
本地目录。
./myproject.conf
。 -
用户的主目录(
~user/myproject.conf
) -
一个标准的系统范围目录(
/etc/myproject/myproject.conf
) -
由环境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')