72

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

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

我使用ConfigParser来解析myproject.conf文件。

在我的代码中,很容易加载具有良好路径的文件:my_project/conf/myproject.conf

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

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

此外,如果可能的话,我希望是便携的(例如在 Windows 上工作)。

这样做的好习惯是什么?

4

7 回答 7

46

你见过配置文件是如何工作的吗?阅读“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
于 2011-09-27T10:54:18.750 回答
22

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

于 2012-10-06T18:29:52.167 回答
18

如果您正在使用setuptools,请参阅使用非包数据文件的章节。不要尝试自己查找文件。

于 2011-09-27T10:56:49.123 回答
6

更新 S.Lott 的答案。

现在该方法configparser.ConfigParser.readfp()已弃用。</p>

您可以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()

configparser.ConfigParser.read()

于 2020-03-27T02:17:37.157 回答
2

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

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
于 2011-09-27T10:51:19.933 回答
2

另一种选择是将所有.cfg.ini文件保留在主目录中,就像'boto'一样。

import os.path
config_file = os.path.join(os.path.expanduser("~"), '.myproject')
于 2015-07-09T11:40:16.590 回答
1

编写安装脚本的文档,在第2.7 节下。安装附加文件提到:

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

于 2020-01-02T20:12:15.990 回答