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

问题描述 投票:49回答:5

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

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

另外,如果可能的话,我想要便携式(例如在Windows上工作)。

这样做的好习惯是什么?

python pythonpath configparser
5个回答
35
投票

你看过配置文件是如何工作的吗?阅读“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

14
投票

如果你正在使用setuptools,请参阅using non-package data files章节。不要试图自己寻找文件。


11
投票

appdirs软件包在各种平台上找到已安装应用程序的标准位置方面做得很好。我想知道是否扩展它以发现或允许开发人员某种“未安装”的状态是有道理的。


2
投票

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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.