1

我在编写支持读取包含 toml 包配置文件的文件路径的 add 参数时遇到了一些麻烦。我需要写的是 CLI 的一个简单命令,其中可以将配置文件指定为 CLI 的选项: m2mtest --config <file_path> -

这部分我认为是:

    parser.add_argument('--config', type=argparse.FileType('r'), help='A configuration file for the CLI', default = [ f for f in os.listdir( '.' )
                            if os.path.isfile( f ) and f == "m2mtest_config.toml"],
                dest = 'config' )
    if parser.config is not None:
        dict = toml.load(parser.config, _dict=dict)

我不确定我是否写对了..我需要做的是:

如果未指定 --config 选项,则在当前目录中查找名为 m2mtest_config.toml 的文件;如果存在这样的文件,请使用它。

如果不存在这样的文件,则该 CLI 运行不使用配置文件——要使用的选项是命令行中指定的选项。

如果在命令行和配置文件中都指定了选项,则命令行值会覆盖配置文件值

我真的很想得到一些帮助来实现这条线。我知道我不需要解析 toml 配置文件的文件,因为 toml.load(f,_dict=dict) 会这样做并将其保存到字典中。

非常感谢

4

1 回答 1

0

你打电话了parser.parse_args()吗?另外,不确定您示例中的最后一行。我认为 dict是保留字而不是有效变量。此外,不确定您是否需要loads(not load) 的第二个参数。无论如何,这对我有用:

import argparse
import os
import toml

parser = argparse.ArgumentParser()

parser.add_argument(
    '--config', 
    type=argparse.FileType('r'), 
    help='A configuration file for the CLI', 
    default = [ 
        f for f in os.listdir( '.' ) 
        if os.path.isfile( f ) and f == "m2mtest_config.toml"
    ], 
    dest = 'config' 
)

args = parser.parse_args()
toml_config = toml.loads(parser.config) if args.config else {}

# merge command line config over config file
config = {**toml_config, **vars(args)}
于 2020-12-18T22:59:50.733 回答