从命令行获取参数,然后从文件获取参数,然后从默认值获取参数
我有一个根据某些参数运行的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的方式来做到这一点”,以我的方式?这是准读取可以指定为参数的配置文件,所以我期望有一个好方法。
假设您使用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
如果我可以在命令行中指定的值之一被允许为“无”,则这不起作用。暂时将此特定值更改为“False”会有所帮助,但本质上这仍然与我的初步解决方案有同样的问题。 – Anaphory 2013-02-15 10:49:41
在argsparse有fromfile-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
虽然它依赖于你记得把配置文件中的正确的顺序,除非你采取参数,并重新排列它们,使它们首先在参数中。
有希望的思想。
'python parsing.py --file = MakeC5 --C = 3'与上面例子中的'python parsing.py --file = MakeC5 --C = 4'有什么不同? – 2013-02-13 13:02:26
'C = 3'是默认值,所以这就是为什么'if parameters.C = parser.get_default('C'):parameters.C = load_file(parameters.file)[“C”]'不起作用的原因,这是我的第一个想法来实现这一点。 – Anaphory 2013-02-13 13:05:51
我认为这几乎是这个目前特色的问题的一个骗局:http://*.com/q/6133517/748858 – mgilson 2013-02-13 13:09:08