使用文件存储optparse参数
我已经使用optparse一段时间了,现在想要增加一个功能,就是能够从配置文件中加载参数。
到目前为止,我能想到的最好办法就是写一个包裹的批处理脚本,把参数直接写死在里面……感觉这样太笨重了。
有没有更优雅的方法来实现这个功能呢?
6 个回答
4
我遇到了类似的问题,但我还想把配置文件作为一个参数来指定。受到S. Lott的回答启发,我写出了以下代码。
示例终端会话:
$ python defaultconf.py # use hard-coded defaults False $ python defaultconf.py --verbose # verbose on command line True $ python defaultconf.py --loadconfig blah # load config with 'verbose':True True $ python defaultconf.py --loadconfig blah --quiet # Override configured value False
代码:
#!/usr/bin/env python2.6
import optparse
def getParser(defaults):
"""Create and return an OptionParser instance, with supplied defaults
"""
o = optparse.OptionParser()
o.set_defaults(**defaults)
o.add_option("--verbose", dest = "verbose", action="store_true")
o.add_option("--quiet", dest = "verbose", action="store_false")
o.add_option("--loadconfig", dest = "loadconfig")
return o
def main():
# Hard coded defaults (including non-command-line-argument options)
my_defaults = {'verbose': False, 'config_only_variable': 42}
# Initially parse arguments
opts, args = getParser(my_defaults).parse_args()
if opts.loadconfig is not None:
# Load config from disk, update the defaults dictionary, and reparse
# Could use ConfigParser, simplejson, yaml etc.
config_file_values = {'verbose': True} # the dict loaded from disk
my_defaults.update(config_file_values)
opts, args = getParser(my_defaults).parse_args()
print opts.verbose
if __name__ == '__main__':
main()
23
我同意S.Lott关于使用配置文件的想法,但我建议使用内置的ConfigParser(在3.0版本中叫configparser)模块来解析配置文件,而不是自己编写一个解决方案。
下面是一个简单的脚本,展示了ConfigParser和optparse的实际应用。
import ConfigParser
from optparse import OptionParser
CONFIG_FILENAME = 'defaults.cfg'
def main():
config = ConfigParser.ConfigParser()
config.read(CONFIG_FILENAME)
parser = OptionParser()
parser.add_option("-l",
"--language",
dest="language",
help="The UI language",
default=config.get("Localization", "language"))
parser.add_option("-f",
"--flag",
dest="flag",
help="The country flag",
default=config.get("Localization", "flag"))
print parser.parse_args()
if __name__ == "__main__":
main()
输出结果:
(<Values at 0x2182c88: {'flag': 'japan.png', 'language': 'Japanese'}>, [])
运行命令 "parser.py --language=French
":
(<Values at 0x2215c60: {'flag': 'japan.png', 'language': 'French'}>, [])
帮助功能是内置的。
运行命令 "parser.py --help
":
Usage: parser.py [options]
Options:
-h, --help show this help message and exit
-l LANGUAGE, --language=LANGUAGE
The UI language
-f FLAG, --flag=FLAG The country flag
配置文件内容:
[Localization]
language=Japanese
flag=japan.png