创建和读取配置目录/文件,从配置设置argparse(子)解析器的默认值
项目描述
此模块提供了一种轻松向应用程序添加配置目录和配置文件的方法。配置目录可以用于存储额外的用户特定数据文件。
默认情况下,它使用ruamel.yaml来读取和写入配置文件,因为这个库保留了任何添加的注释(而Python自己的ConfigParser会丢弃这些注释)。
基本调用方式是
from __future__ import print_function import sys from ruamel.appconfig import AppConfig def to_stdout(*args): sys.stdout.write(' '.join(args)) ac = AppConfig( 'appconfigbasic', # name of config diretory, normally the application name warning=to_stdout, )
from __future__ import print_function import sys from ruamel.appconfig import AppConfig def to_stdout(*args): sys.stdout.write(' '.join(args)) ac = AppConfig( 'appconfigbasic', # name of config directory, normally the application name warning=to_stdout, )
结果为
created directory /home/a114/.config/appconfigbasic
默认情况下(在Linux/macOS上),配置目录位于~/.config下,默认配置文件将是~/.config/appconfigbasic/appconfigbasic.ini(appconfigbasic是传递给AppConfig()的值)。在此之前,会检查该文件是否已存在,或者是否已存在~/.appconfigbasic/appconfigbasic.ini或~/.appconfigbasic.ini。
在Windows上,配置目录应为$APPDATA/appconfigbasic
与argparse的交互
AppConfig()具有与argparse参数解析交互的额外选项
它能够填充应用程序选项的默认值(包括子解析器的选项)。
它可以添加一个--config选项,允许用户指定配置文件的替代路径。
它可以将一个 --save-defaults 参数添加到配置文件中,用户可以使用该参数将命令行中指定的选项的值保存到配置文件中。全局选项存储在配置文件的 [global] 部分,子解析器的选项存储在具有子解析器名称的章节中。
添加 --config
要添加此选项,请传入解析器并将 filename 参数设置到 AppConfig.check 属性
from __future__ import print_function from argparse import ArgumentParser from ruamel.appconfig import AppConfig parser = ArgumentParser() ac = AppConfig( 'appconfigconfig', parser=parser, # needed to set new options filename=AppConfig.check, # sets --config option ) parser.parse_args(['--help'])
结果为
usage: addconfig.py [-h] [--config FILE] optional arguments: -h, --help show this help message and exit --config FILE set FILE as configuration file [~/.config/appconfigconfig/appconfigconfig.ini]
设置默认值和添加 --save-defaults
要将默认值保存到配置文件
from __future__ import print_function from argparse import ArgumentParser from ruamel.appconfig import AppConfig parser = ArgumentParser() parser.add_argument('--delete', '-d', default='bla', help='delete a file (default: %(default)s)') parser.add_argument('--owner', default='itsme', help='set owner (default: %(default)s)') parser.add_argument('--force', action='store_true', help='force action (default: %(default)s)') ac = AppConfig( 'addconfigsave', parser=parser, # needed to set new options filename=AppConfig.check, # sets --config option add_save=True, # add save option ) ac.set_defaults() # set the ArgumentParser() defaults # and save to config file args = ac.parse_args(['--delete', 'two', '--save-defaults']) with open(ac.get_file_name()) as fp: print(fp.read())
结果为
[global] delete = two owner = itsme force = False
与 ruamel.std.argparse 装饰器的交互
由于 ruamel.std.argparse 装饰器是围绕正常 argparse 使用的一个包装器,因此添加 AppConfig() 非常简单
from __future__ import print_function import sys import os from ruamel.std.argparse import ProgramBase, option, sub_parser, version, \ SmartFormatter class TestCmd(ProgramBase): def __init__(self): super(TestCmd, self).__init__( formatter_class=SmartFormatter ) # you can put these on __init__, but subclassing TestCmd # will cause that to break @option('--quiet', '-q', help='suppress verbosity', action='store_true', global_option=True) @version('version: 1.2.3') def _pb_init(self): # special name for which attribs are included in help pass def run(self): if self._args.func: return self._args.func() def parse_args(self, *args): from ruamel.appconfig import AppConfig app = 'addconfigcomplex' # pre populate config file with open(os.path.expanduser( '~/.config/{}/{}.ini'.format(app, app)), 'w') as fp: fp.write('[readit]\nname=XYZ\n') self._config = AppConfig( app, parser=self._parser, # self._parser set by ProgramBase filename=AppConfig.check, # sets --config option add_save=True, # add save option ) self._config.set_defaults() self._parse_args(*args) @sub_parser(help='specific help for readit') @option('--name', default='abc', help='help for name (default: %(default)s)') def readit(self): print('calling readit') @sub_parser('writeit', help='help for writeit') @option('--target') def other_name(self): print('calling writeit') n = TestCmd() n.parse_args(['readit', '--help']) # normaly no parameters -> sys.argv n.run() # never reached
有输出(请注意,因为配置文件是在 AppConfig 实例化之前编写的,所以 XYZ 是默认值)
usage: complex.py readit [-h] [--name NAME] [--quiet] [--save-defaults] optional arguments: -h, --help show this help message and exit --name NAME help for name (default: XYZ) --quiet, -q suppress verbosity --save-defaults save option values as defaults to config file
项目详情
ruamel.appconfig-0.5.5.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4faefed5ba577c16e4af6c00deb20a92a92d4e60088608a7ba83f8760540b13f |
|
MD5 | a45183fd425da2ecf36d145f22f10982 |
|
BLAKE2b-256 | 293364fc609387786604420bdbd9836cfc6b994b419bcea25cce55f9aa5ee8c2 |
ruamel.appconfig-0.5.5-py2.py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fc0183c6748c07c5d838f046a5b18be07fb7a1bcf5a7410b6fbd2fa619ab2c29 |
|
MD5 | 9905a8b48a93e1410d5b574c379569fd |
|
BLAKE2b-256 | 4390126cdfd6e05e7be4cc09354c5d4445951a65b9fb61dfb5507d75ab410dc2 |