使用文件存储optparse参数

16 投票
6 回答
5726 浏览
提问于 2025-04-15 16:52

我已经使用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()

你可以在Github上找到一个实际的实现:默认字典参数解析器主函数

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')

它可能已经包含在标准库中了,具体可以查看 pep 389

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

撰写回答