从命令行获取参数,然后从文件获取参数,然后从默认值获取参数

从命令行获取参数,然后从文件获取参数,然后从默认值获取参数

问题描述:

我有一个根据某些参数运行的python程序。比方说,其中一个参数是C,默认值为3。所以,当我不带任何参数运行它,但它确实从命令行获取参数,然后从文件获取参数,然后从默认值获取参数

$ python parsing.py 
C=3 

当我打开我的最初的数据文件,它可以从文件中获取一些参数值。例如,如果我的文件MakeC5说,该计划应与C=5跑,我会得到

$ python parsing.py --file=MakeC5 
C=5 

在另一方面,如果我指定C作为可选的参数不同的值,该值将被采取,并且优先超过文件中的值。

$ python parsing.py --C=4 
C=4 

$ python parsing.py --file=MakeC5 --C=4 
C=4 

到这里,我可以检查,如果在命令行上指定的值从缺省值不同,否则采取从该文件的一个,与

if parameters.C == parser.get_default('C'): 
    parameters.C = load_file(parameters.file)["C"] 

但这种方法如果我在命令行中给出C的默认值,则不起作用

$ python parsing.py --file=MakeC5 --C=3 
C=3 

如何获得该案例的权利?是否有不需要两次解析命令行中

parameters = parser.parse_args() 
parameters_from_file = load_file(parameters.file) 
parser.set_defaults(**parameters_from_file) 
parameters = parser.parse_args() 

它看起来并不像“明显的Python的方式来做到这一点”,以我的方式?这是准读取可以指定为参数的配置文件,所以我期望有一个好方法。

+0

'python parsing.py --file = MakeC5 --C = 3'与上面例子中的'python parsing.py --file = MakeC5 --C = 4'有什么不同? – 2013-02-13 13:02:26

+0

'C = 3'是默认值,所以这就是为什么'if parameters.C = parser.get_default('C'):parameters.C = load_file(parameters.file)[“C”]'不起作用的原因,这是我的第一个想法来实现这一点。 – Anaphory 2013-02-13 13:05:51

+0

我认为这几乎是这个目前特色的问题的一个骗局:http://*.com/q/6133517/748858 – mgilson 2013-02-13 13:09:08

假设您使用argparse module,只需在添加参数时不要设置默认参数。那么属性将None如果参数不存在,你可以检查导致,而不是解析参数两次:

parser.add_argument('--C' , action='store', dest='C') 
parser.add_argument('--file', action='store', dest='file') 
# ... 

args = parser.parse_args() 
# ... 

if args.C is None: 
    # Argument `--C` not given on command line 
    if args.file is not None: 
     # Load the file, set `args.C` if the file contains the `C` option 
     ... 

if args.C is None: 
    # `C` was neither specified on the command line argument given, 
    # nor in the configuration file, set default value 
    args.C = 3 

print 'C =', args.C 
+1

如果我可以在命令行中指定的值之一被允许为“无”,则这不起作用。暂时将此特定值更改为“False”会有所帮助,但本质上这仍然与我的初步解决方案有同样的问题。 – Anaphory 2013-02-15 10:49:41

argsparsefromfile-prefix-chars,它似乎是你想,如果你做一些可以忍受它的局限性。

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo', default="ABC") 
args = parser.parse_args() 
print '#1', args.foo 

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo', default="ABC") 
args = parser.parse_args(['--foo', 'BAR' ]) 
print '#2', args.foo 

import argparse 
parser = argparse.ArgumentParser(fromfile_prefix_chars='@') 
parser.add_argument('--foo', default="ABC") 
args = parser.parse_args(['--foo', 'BAR', '@myargs' ]) 
print '#3', args.foo 

import argparse 
parser = argparse.ArgumentParser(fromfile_prefix_chars='@') 
parser.add_argument('--foo', default="ABC") 
args = parser.parse_args(['@myargs', '--foo', 'BAR' ]) 
print '#4', args.foo 

myargs

--foo 
FISH 

输出

#1 ABC 
#2 BAR 
#3 FISH 
#4 BAR 

通知在命令行上@myargs的位置如何影响foo值,当它的在前面它的值如果被覆盖--foo,反之亦然。

这似乎做你想要的地方:

默认值<配置文件中< CLI-ARGS

虽然它依赖于你记得把配置文件中的正确的顺序,除非你采取参数,并重新排列它们,使它们首先在参数中。

有希望的思想。