Python中OptionParser模块 - 同一变量的多个条目?

6 投票
5 回答
8041 浏览
提问于 2025-04-15 22:16

我正在写一个小的Python脚本,用来从几个服务器或者单个服务器获取一些统计数据。我使用OptionParser来解析命令行输入。

#!/usr/bin/python

import sys
from optparse import OptionParser
...
parser.add_option("-s", "--server", dest="server", metavar="SERVER", type="string", 
                  help="server(s) to gather stats [default: localhost]")
...

我的目标是能够做到类似这样的事情

#test.py -s server1 -s server2

这样的话,它会把这两个值以某种方式添加到options.server对象中,这样我就可以遍历它们,不管它们有1个值还是10个值。

任何想法或帮助都很感谢。谢谢。

5 个回答

2

你可以看看argparse这个工具。它提供了一个叫“nargs”的参数,这样你就可以做一些类似下面的事情。

#test.py -s server1 server2

我知道这不是完全符合你的要求,但这可能是一个不错的折中方案,而且不会太麻烦。:)

3

是的,可以使用optparse来实现。

下面是一个例子:

./test.py --categories=aaa --categories=bbb --categories ccc arg1 arg2 arg3

这个例子会输出:

arguments: ['arg1', 'arg2', 'arg3']
options: {'categories': ['aaa', 'bbb', 'ccc']}

完整的工作示例在下面:

#!/usr/bin/env python

import os, sys
from optparse import OptionParser
from optparse import Option, OptionValueError

VERSION = '0.9.4'

class MultipleOption(Option):
    ACTIONS = Option.ACTIONS + ("extend",)
    STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
    TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
    ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",)

    def take_action(self, action, dest, opt, value, values, parser):
        if action == "extend":
            values.ensure_value(dest, []).append(value)
        else:
            Option.take_action(self, action, dest, opt, value, values, parser)


def main():
    PROG = os.path.basename(os.path.splitext(__file__)[0])
    long_commands = ('categories')
    short_commands = {'cat':'categories'}
    description = """Just a test"""
    parser = OptionParser(option_class=MultipleOption,
                          usage='usage: %prog [OPTIONS] COMMAND [BLOG_FILE]',
                          version='%s %s' % (PROG, VERSION),
                          description=description)
    parser.add_option('-c', '--categories', 
                      action="extend", type="string",
                      dest='categories', 
                      metavar='CATEGORIES', 
                      help='comma separated list of post categories')

    if len(sys.argv) == 1:
        parser.parse_args(['--help'])

    OPTIONS, args = parser.parse_args()
    print "arguments:", args
    print "options:", OPTIONS

if __name__ == '__main__':
    main()

更多信息请查看 http://docs.python.org/library/optparse.html#adding-new-actions

13
import optparse

parser = optparse.OptionParser()
parser.add_option('-t', '--test', action='append')

options, args = parser.parse_args()
for i, opt in enumerate(options.test):
    print 'option %s: %s' % (i, opt)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答