Python 我应该如何在~/.config或类似文件中创建和读取用户可编辑的配置文件?

Python 我应该如何在~/.config或类似文件中创建和读取用户可编辑的配置文件?,python,packaging,pypi,Python,Packaging,Pypi,我正在计划一个命令行Python应用程序,我打算通过PyPi发布它 当应用程序与pip一起安装时,我想在用户文件系统的适当位置创建一个用户可编辑的配置文件 例如,在Ubuntu中,该文件类似于~/.config/foo/config.ini 在安装时,我希望创建该文件(如果可能的话),并能够指定另一个配置文件来代替命令行参数 完成这项工作的通常方案是什么 我认为PyPI上的appdirs包是您所需要的,不是吗?像这样的项目(从中派生)可以帮助完成这样的任务。它实现了 但不要在安装时创建文件。最好

我正在计划一个命令行Python应用程序,我打算通过PyPi发布它

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

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

在安装时,我希望创建该文件(如果可能的话),并能够指定另一个配置文件来代替命令行参数


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

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

像这样的项目(从中派生)可以帮助完成这样的任务。它实现了

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

类似于以下内容的内容可以让您开始使用配置目录:

>>> 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()
您应该为此使用该模块,因为它可以可靠地处理不同平台之间的差异:

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

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