使用getopt/optparse处理单个选项的多个值?

29 投票
7 回答
38693 浏览
提问于 2025-04-16 06:38

有没有办法通过getopt或optparse来获取一个选项的多个值,像下面这个例子一样:

./hello_world -c arg1 arg2 arg3 -b arg4 arg5 arg6 arg7

请注意,每个选项(-c, -b)实际可以有的值的数量可能是1个,也可能是100个。我不想使用: ./hello_world -c "arg1 arg2 arg3" -b "arg4 arg5 arg6 arg7"

我觉得这可能不太可能实现(而且可能违反了POSIX标准),如果我错了请纠正我。

我见过一些例子,所有非选项的参数都在行的末尾(./hello_world -c arg1 -b arg1 arg2 arg3),可以被收集起来……但对于多个选项的第一个值却不行。

我希望我的应用能够在不同的Python版本和各种平台上运行,所以我没有考虑使用argparser。

7 个回答

8

抱歉我来得有点晚,但我刚刚用optparse解决了这个问题,使用了nargs这个标志。

parser.add_option('-c','--categories', dest='Categories', nargs=4 )

http://docs.python.org/2/library/optparse.html#optparse.Option.nargs

还值得一提的是,argparse(由unutbu推荐)现在已经成为标准的Python库,而optparse已经不再推荐使用了。

14

尽管其他评论中有不同的说法,但在Python 2.7中,使用普通的optparse也是可以做到的。你只需要使用action="append"。根据文档的说明:

parser.add_option("-t", "--tracks", action="append", type="int")

如果在命令行中看到-t3,optparse会做相当于:

options.tracks = []
options.tracks.append(int("3"))

如果稍后看到--tracks=4,它会做:

options.tracks.append(int("4"))
18

是的,可以使用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

撰写回答