在开发模式下,我有以下目录树:
| my_project/
| setup.py
| my_project/
| __init__.py
| main.py
| conf/
| myproject.conf
我使用ConfigParser来解析myproject.conf
文件。
在我的代码中,很容易加载具有良好路径的文件:my_project/conf/myproject.conf
问题是:当我使用setup.py安装我的项目时,配置文件位于/etc/my_project/myproject.conf
中的(由于setup.py)和/usr/lib/python<version>/site-packages/my_project/
中的应用程序。
如何在“生产”模式下在项目中引用我的my_project/conf/myproject.conf
文件,并在“devel”模式下引用本地文件(my_project/conf/myproject.conf
)。
另外,如果可能的话,我想要便携式(例如在Windows上工作)。
这样做的好习惯是什么?
你看过配置文件是如何工作的吗?阅读“rc”文件,因为它们有时被称为。 “bashrc”,“vimrc”等
通常会对配置文件进行多步搜索。
./myproject.conf
。~user/myproject.conf
)/etc/myproject/myproject.conf
)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
,请参阅using non-package data files章节。不要试图自己寻找文件。
appdirs软件包在各种平台上找到已安装应用程序的标准位置方面做得很好。我想知道是否扩展它以发现或允许开发人员某种“未安装”的状态是有道理的。
另一种选择是将所有.cfg
和.ini
文件保存在主目录中,如'boto'。
import os.path
config_file = os.path.join(os.path.expanduser("~"), '.myproject')
我不认为有一个干净的方法来解决这个问题。您可以简单地选择测试是否存在“本地”文件,该文件可以在开发模式下运行。否则,回到生产路径:
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