我有一个Python应用程序,需要很多(~30)配置参数.到目前为止,我使用OptionParser类在应用程序本身中定义默认值,可以在调用应用程序时在命令行中更改单个参数.
现在我想使用'正确'的配置文件,例如来自ConfigParser类.同时,用户仍应能够在命令行中更改单个参数.
我想知道是否有任何方法可以将这两个步骤结合起来,例如使用optparse(或更新的argparse)来处理命令行选项,但是在ConfigParse语法中从配置文件中读取默认值.
任何想法如何轻松地做到这一点?我真的不想手动调用ConfigParse,然后手动将所有optinos的所有默认值设置为适当的值...
我有一个脚本,它具有某些选项,可以在命令行上传递,也可以从环境变量传递.如果两者都存在,则CLI应该优先,如果两者都没有,则会发生错误.
我可以检查解析后是否分配了该选项,但我更喜欢让argparse执行繁重的工作并负责在解析失败时显示用法语句.
我已经提出了几种替代方法(我将在下面作为答案发布,以便可以单独讨论),但他们觉得我很笨,我认为我错过了一些东西.
是否有一种被接受的"最佳"方式?
(编辑以在未设置CLI选项和环境变量时清除所需的行为)
我有一个python程序,它运行取决于一些参数.比方说,其中一个参数C的默认值为3.因此,当我在没有任何参数的情况下运行它时,它会
$ python parsing.py
C=3
Run Code Online (Sandbox Code Playgroud)
当我为初始数据加载文件时,它可以从该文件中获取一些参数值.例如,如果我的文件MakeC5说程序应该运行C=5,我会得到
$ python parsing.py --file=MakeC5
C=5
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我将C的不同值指定为可选参数,则采用该值,并且优先于文件中的值.
$ python parsing.py --C=4
C=4
$ python parsing.py --file=MakeC5 --C=4
C=4
Run Code Online (Sandbox Code Playgroud)
到这里,我可以检查命令行上指定的值是否与默认值不同,否则从文件中取出一个,如同
if parameters.C == parser.get_default('C'):
parameters.C = load_file(parameters.file)["C"]
Run Code Online (Sandbox Code Playgroud)
但是,如果我在命令行中给出C的默认值,则此方法不起作用
$ python parsing.py --file=MakeC5 --C=3
C=3
Run Code Online (Sandbox Code Playgroud)
我该如何处理这个案子呢?有没有一种方法不需要像在中那样解析命令行两次
parameters = parser.parse_args()
parameters_from_file = load_file(parameters.file)
parser.set_defaults(**parameters_from_file)
parameters = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
对我来说这看起来不像"明显的pythonic方式"吗?这是准读取可以指定为参数的配置文件,所以我希望有一个好方法.