在开发模式下,我有以下目录树:
| 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
文件,并在“开发”模式下引用本地文件(my_project/conf/myproject.conf
)。
另外,如果可能的话,我想要便携式(例如在Windows上工作)。
这样做的好习惯是什么?
答案 0 :(得分:36)
你看过配置文件是如何工作的吗?阅读“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
答案 1 :(得分:14)
如果您使用的是setuptools
,请参阅using non-package data files一章。不要试图自己寻找文件。
答案 2 :(得分:13)
appdirs包在找到各种平台上安装的应用程序的标准位置方面做得很好。我想知道是否扩展它以发现或允许某种&#34;卸载&#34;开发人员的状态是有意义的。
答案 3 :(得分:3)
更新S.Lott的答案。
现在不建议使用方法configparser.ConfigParser.readfp()
。
您可以直接将configparser.ConfigParser.read()
方法用于多个文件。
例如:
import configparser
config = config = configparser.ConfigParser()
all_config_files = ['/path/to/file1', '/path/to/file2', '/path/to/file3']
config.read(all_config_files)
注意:
read()
将忽略它。read_file()
。答案 4 :(得分:2)
另一种选择是将所有.cfg
和.ini
个文件保留在主目录中,例如&#39; boto&#39;确实
import os.path
config_file = os.path.join(os.path.expanduser("~"), '.myproject')
答案 5 :(得分:1)
我认为没有一种干净的方法可以解决这个问题。您可以简单地选择测试是否存在“本地”文件,该文件可以在开发模式下运行。否则,回到生产路径:
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
答案 6 :(得分:-1)
Writing the Setup Script的2.7. Installing Additional Files下的文档中提到:
data_files
选项可用于指定模块分发所需要的其他文件:配置文件,消息目录,数据文件以及不属于先前类别的任何文件。