Python单击-从配置文件中提供参数和选项

Python单击-从配置文件中提供参数和选项,python,command-line-interface,python-click,Python,Command Line Interface,Python Click,鉴于以下计划: #!/usr/bin/env python import click @click.command() @click.argument("arg") @click.option("--opt") @click.option("--config_file", type=click.Path()) def main(arg, opt, config_file): print("arg: {}".format(arg)) print("opt: {}".format(

鉴于以下计划:

#!/usr/bin/env python
import click

@click.command()
@click.argument("arg")
@click.option("--opt")
@click.option("--config_file", type=click.Path())
def main(arg, opt, config_file):
    print("arg: {}".format(arg))
    print("opt: {}".format(opt))
    print("config_file: {}".format(config_file))
    return

if __name__ == "__main__":
    main()
我可以使用命令行提供的参数和选项运行它

$ ./click_test.py my_arg --config_file my_config_file
arg: my_arg
opt: None
config_file: my_config_file
如何将配置文件(在
ini
yaml
py
json
?)提供给
--config_文件
),并接受内容作为参数和选项的值

例如,我希望
我的配置文件
包含

opt: my_opt
并使程序的输出显示:

$ ./click_test.py my_arg --config_file my_config_file
arg: my_arg
opt: my_opt
config_file: my_config_file

我找到了
回调
函数,该函数看起来很有用,但我找不到一种方法来修改同一函数的同级参数/选项。

这可以通过使用
click.Command.invoke()
方法来完成,如:

自定义类: 使用自定义类: 然后,要使用自定义类,请将其作为cls参数传递给命令装饰器,如:

@click.command(cls=CommandWithConfigFile('config_file'))
@click.argument("arg")
@click.option("--opt")
@click.option("--config_file", type=click.Path())
def main(arg, opt, config_file):
测试代码: 测试结果:
您是否尝试过:?我希望这可以在没有外部软件包的情况下实现。关于这与单击配置或单击配置文件的比较,您有何看法?@eric.frederich,这只是一个快速练习,演示如何构建您自己的东西,因此没有意见支持/反对库。
@click.command(cls=CommandWithConfigFile('config_file'))
@click.argument("arg")
@click.option("--opt")
@click.option("--config_file", type=click.Path())
def main(arg, opt, config_file):
# !/usr/bin/env python
import click
import yaml

@click.command(cls=CommandWithConfigFile('config_file'))
@click.argument("arg")
@click.option("--opt")
@click.option("--config_file", type=click.Path())
def main(arg, opt, config_file):
    print("arg: {}".format(arg))
    print("opt: {}".format(opt))
    print("config_file: {}".format(config_file))


main('my_arg --config_file config_file'.split())
arg: my_arg
opt: my_opt
config_file: config_file