我正在编写一个小的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。
任何想法/帮助表示赞赏。感谢。
答案 0 :(得分: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)
答案 1 :(得分: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
的更多信息答案 2 :(得分:2)
您可以尝试查看argparse。它提供了“nargs”参数,意味着你可以沿着
做一些事情#test.py -s server1 server2
我知道这并不是所要求的,但它可能是一个体面的妥协,没有太多的麻烦。 :)
答案 3 :(得分:2)
可以更容易接受以逗号分隔的服务器列表:
# test.py -s server1,server2
并在脚本中拆分值。
答案 4 :(得分:1)
这是一个已知的工作示例(来自http://docs.python.org/library/email-examples.html):
parser.add_option('-r', '--recipient',
type='string', action='append', metavar='RECIPIENT',
default=[], dest='recipients',
help='A To: header value (at least one required)')
我认为用法类似于:
python script.py -r some@where.com -r no@where.com -r any@where.com