【问题标题】:How should I create and read a user editable configuration file in ~/.config or similar?我应该如何在 ~/.config 或类似文件中创建和读取用户可编辑的配置文件?
【发布时间】:2020-04-08 09:54:27
【问题描述】:

我正在计划一个我打算通过 PyPi 分发的命令行 Python 应用程序。

当使用 pip 安装应用程序时,我想在用户文件系统的适当位置创建一个用户可编辑的配置文件。

例如,在 Ubuntu 中,该文件类似于 ~/.config/foo/config.ini

在安装时,我想创建文件(如果可能)并能够指定另一个配置文件来使用命令行参数。

完成这项工作的通常方案是什么?

【问题讨论】:

  • 程序第一次运行时可以创建文件。
  • 别忘了创建目录。如果目录不存在,则无法创建文件。

标签: python packaging pypi


【解决方案1】:

您应该为此使用appdirs 模块,因为它可以可靠地处理不同平台之间的差异:

>>> from appdirs import user_config_dir
>>> appname = "SuperApp"
>>> appauthor = "Acme"
>>> user_config_dir(appname)
'/home/trentm/.config/SuperApp'

【讨论】:

    【解决方案2】:

    xdgappdirs(源自appdirs)这样的项目可以帮助完成这样的任务。它实现了Freedesktop's "XDG Base Directory Specification"

    不要在安装时创建文件。最好在实际需要时创建文件,例如,这可能是在应用程序的第一次运行期间。

    以下内容应该可以帮助您开始配置目录:

    >>> import appdirs
    >>> appdirs.user_config_dir('foo')
    '/home/sinoroc/.config/foo'
    

    或者没有外部依赖,大概是这样的:

    #!/usr/bin/env python3
    
    import argparse
    import os
    import pathlib
    import platform
    
    def get_config_file_path(project_name, file_name):
        path = None
        config_path = None
        platform_system = platform.system()
        if platform_system == 'Windows':
            if 'APPDATA' in os.environ:
                config_path = pathlib.Path(os.environ['APPDATA'])
            else:
                config_path = pathlib.Path.home().joinpath('AppData', 'Roaming')
        elif platform_system == 'Linux':
            if 'XDG_CONFIG_HOME' in os.environ:
                config_path = pathlib.Path(os.environ['XDG_CONFIG_HOME'])
            else:
                config_path = pathlib.Path.home().joinpath('.config')
        if config_path:
            path = config_path.joinpath(project_name, file_name)
        return path
    
    def main():
        default_config_file_path = get_config_file_path('foo', 'config.ini')
        args_parser = argparse.ArgumentParser()
        args_parser.add_argument(
            '--config', '-c',
            default=str(default_config_file_path),
            type=argparse.FileType('r'),
        )
        args = args_parser.parse_args()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案3】:

      我认为 PyPI 上的 appdirs 包是你需要的,不是吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多