以为我会发布我的解决方案,原来的问题/答案给了我很多帮助。
我的问题与罗素的有点不同。我使用OptionParser,而不是每个参数的环境变量,我只有一个模拟命令行。
即
MY_ENVIRONMENT_ARGS = --arg1 “马耳他” --arg2 “猎鹰” -r “1930” -h
解决方案:
def set_defaults_from_environment(oparser):
if 'MY_ENVIRONMENT_ARGS' in os.environ:
environmental_args = os.environ[ 'MY_ENVIRONMENT_ARGS' ].split()
opts, _ = oparser.parse_args(environmental_args)
oparser.defaults = opts.__dict__
oparser = optparse.OptionParser()
oparser.add_option('-a', '--arg1', action='store', default="Consider")
oparser.add_option('-b', '--arg2', action='store', default="Phlebas")
oparser.add_option('-r', '--release', action='store', default='1987')
oparser.add_option('-h', '--hardback', action='store_true', default=False)
set_defaults_from_environment(oparser)
options, _ = oparser.parse_args(sys.argv[1:])
这里,我并不抛出错误,如果没有找到参数。但是,如果我想我可以做这样的事情
for key in options.__dict__:
if options.__dict__[key] is None:
# raise error/log problem/print to console/etc
默认情况下,这将被编辑查找os.environ? “如果在os.environ中的envvar:default = envvar” - >“如果在os.environ中的envvar:default = os.environ [envvar]” – spazm
如果没有默认值,为什么只使用envvar指定的值?它不应该重写默认值,因为调用者明确提供了一个值吗? –
这个解决方案非常棒。但是,它有一个副作用:取决于您的环境(是否设置了env var),使用情况文本可能有所不同。 –