Python中配置文件放在哪里?

81 投票
7 回答
71436 浏览
提问于 2025-04-17 03:10

在开发模式下,我的文件夹结构是这样的:

| 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 这个位置,而我的应用程序则在 /usr/lib/python<version>/site-packages/my_project/ 里。

我该如何在“生产”模式下引用 my_project/conf/myproject.conf 这个文件,同时在“开发”模式下又能引用本地的文件 (my_project/conf/myproject.conf) 呢?

另外,如果可以的话,我希望这个方法是可移植的(比如在 Windows 上也能用)。

有什么好的做法吗?

7 个回答

17

如果你在使用 setuptools,可以看看关于 使用非包数据文件 的章节。别自己去找那些文件。

26

appdirs这个包很好地帮助我们找到不同平台上安装应用程序的标准位置。我在想,如果能扩展这个功能,让开发者也能发现或者标记一些“未安装”的状态,这样是否会更有意义呢。

46

你知道配置文件是怎么工作的吗?可以了解一下“rc”文件,这种文件有时被称为“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

撰写回答