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

Python中的配置文件放在哪里?,python,pythonpath,configparser,Python,Pythonpath,Configparser,在开发模式中,我有以下目录树: | my_project/ | setup.py | my_project/ | __init__.py | main.py | conf/ | myproject.conf 我用来解析myproject.conf文件 在我的代码中,很容易加载具有良好路径的文件:my_project/conf/myproject.conf 问题是:当我使用setup.py安装我的项目时,配置文件(由于setup.py)位于/etc/my_

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

| my_project/
| setup.py
| my_project/
    | __init__.py
    | main.py
    | conf/
        | myproject.conf
我用来解析
myproject.conf
文件

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

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

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

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


这样做的好方法是什么?

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

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”文件,有时也被称为“rc”。“bashrc”、“vimrc”等

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

  • 本地目录
    /myproject.conf

  • 用户的主目录(
    ~User/myproject.conf

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

  • 由环境变量命名的位置(
    MYPROJECT\u 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
    

    如果您正在使用
    设置工具
    ,请参阅上的章节。不要试图自己查找文件。

    该软件包在为各种平台上安装的应用找到标准位置方面做得很好。我想知道扩展它以发现或允许开发人员处于某种“卸载”状态是否有意义。

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

    import os.path
    config_file = os.path.join(os.path.expanduser("~"), '.myproject')
    
    第节下的文件提到:

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


    更新S.Lott的答案

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

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

    例如:

    导入配置解析器
    config=configparser.configparser()
    所有配置文件=['/path/to/file1'、'/path/to/file2'、'/path/to/file3']
    读取(所有配置文件)
    
    注意:

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

    不过,这不是问题所要求的在Windows中的工作方式。这将“在Windows上工作”。它可能不是Windows的“典型”,但它确实有效。呃-为什么你要尝试使用with语句?引用的文件可能不存在。另外请注意,对于Linux,有XDG规范,因此您应该将配置存储在~/.config/
    os.path中。如果您的windows帐户与windows目录服务相关联,expanduser(“~”
    )会出现问题。嘿,您可以从os.path.join命令中删除括号,或者将*放在列表之前吗,它将采用可变参数而不是列表。现在不鼓励使用
    ~/.myapp
    。相反,您应该遵循,并将其放在
    ~/$XDG\u CONFIG\u HOME/myapp
    ,这可能是
    ~/.CONFIG/myapp
    。上面的链接不再有效。我想新的联系是,但事情已经改变了。当前的文档指向,这就是我猜这条评论想要指向的。到目前为止,使用5月份记录的
    data\u files
    选项似乎是可行的。