使用文件存储optparse参数

时间:2009-12-10 11:35:11

标签: python optparse

我现在一直在使用optparse,并希望添加从配置文件加载参数的功能。

到目前为止,我能想到的最好的是一个带有硬编码参数的包装批处理脚本......看起来很笨拙。

最优雅的方法是什么?

6 个答案:

答案 0 :(得分:23)

我同意S.Lott关于使用配置文件的想法,但我建议使用内置的ConfigParser(3.0中的configparser)模块来解析它,而不是自制的解决方案。< / p>

这是一个简短的脚本,说明了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

答案 1 :(得分:7)

您可以使用argparse模块:

>>> open('args.txt', 'w').write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')

它可能包含在stdlib中,请参阅pep 389

答案 2 :(得分: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()

可以在Github上找到实际的实现:The defaults dictionarythe argument parserthe main function

答案 3 :(得分:3)

这就是set_defaults功能的用途。 http://docs.python.org/library/optparse.html#optparse.OptionParser.set_defaults

创建一个默认值字典的文件。

{ 'arg1': 'this',
'arg2': 'that'
}

然后读取此文件,将其转换为将文本转换为字典,并将此字典作为set_defaults的参数提供。

如果您真的担心eval,请对此文件使用JSON(或YAML)表示法。或者您甚至可以使用.INI文件制作configparser文件并使用exec来获取默认值。

或者您可以使用一个简单的赋值语句列表和arg1 = 'this' arg2 = 'that'

配置文件。

defaults= {}
with open('defaults.py','r') as config
    exec config in {}, defaults

阅读配置文件。

{{1}}

答案 4 :(得分:2)

从文件中以相同的命令行格式读取参数,例如@commands,然后使用原始解析器来解析它们。

options, args = parser.parse_args()

if args[0][0] == '@': # script.py @optfile 
    with open(args[0][1:]) as f:
        fa = [l.strip() for l in f]
    fa = fa + args[1:] # put back any other positional arguments
    # Use your original parser to parse the new options
    options, args = parser.parse_args(args=fa, values=options)

答案 5 :(得分:0)

我最近用标志和选项构建了很多脚本,并且我已经提出了here所描述的解决方案。

基本上我实例是一个带有特殊标志的optionparser,它告诉我们尝试从文件中加载选项,这样你就可以正常使用脚本从命令行指定选项,或者从文件中提供它们(或者它们的一组)。 / p>

更新:我在GitHub

上共享了代码