在 Python 中将配置文件放在哪里?

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

| 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)。

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

这样做的好方法是什么?

59380 次浏览

我不认为有一个干净的方法来处理这个问题。您可以简单地选择测试是否存在“ local”文件,这将在 dev 模式下工作。否则,就回到生产路径:

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

您了解配置文件是如何工作的吗?仔细阅读“ rc”文件,有时也这么叫。“ bashrc”,“ vimrc”等等。

通常对配置文件进行多步搜索。

  1. 本地目录 ./myproject.conf

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

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

  4. 由环境变量命名的地方(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包在寻找各种平台上安装应用程序的标准位置方面做得很好。我想知道扩展它来发现或允许开发人员处于某种“卸载”状态是否有意义。

另一种选择是像‘ boto’那样将所有 .cfg.ini文件保存在 home 目录中。

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

编写安装脚本的文件在 2.7. 安装附加文件章节中提到:

data_files选项可用于指定模块分发所需的其他文件: 配置文件、消息目录、数据文件,以及任何不符合前面类别的文件。

S · 洛特的最新答案。

现在不推荐使用 configparser.ConfigParser.readfp()方法。

可以直接对多个文件使用 configparser.ConfigParser.read()方法。

例如:

import configparser


config = configparser.ConfigParser()


all_config_files = ['/path/to/file1', '/path/to/file2', '/path/to/file3']


config.read(all_config_files)

注:

  • 后面配置文件中的配置选项将覆盖前面的。
  • 如果配置文件不存在,read()将忽略它。
  • 如果需要从文件中读取所需的选项,请首先使用 read_file()

Read ()