在Python中放置配置文件的位置?

时间:2011-09-27 10:27:19

标签: python pythonpath configparser

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

| 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上工作)。

这样做的好习惯是什么?

7 个答案:

答案 0 :(得分:36)

你看过配置文件是如何工作的吗?阅读“rc”文件,因为它们有时被称为。 “bashrc”,“vimrc”等。

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

  1. 本地目录。 ./myproject.conf

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

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

  4. 由环境变量(MYPROJECT_CONF

  5. 命名的地方

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

configparser.ConfigParser.read()

答案 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 Script2.7. Installing Additional Files下的文档中提到:

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