2010-05-03 24 views
6

我正在寫一個小python腳本來從幾個服務器或單個服務器獲取統計信息,並且我使用OptionParser來分析命令行輸入。OptionParser python模塊 - 相同變量的多個條目?

#!/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.

任何想法/幫助表示讚賞。謝謝。

回答

2

您可以嘗試檢出argparse。它提供了「NARGS」參數意味着你就可以做一些沿

#test.py -s server1 server2 

我知道這不是什麼要求,但它可能是沒有太多的麻煩一個體面的妥協。 :)

2

可能更容易接受一個逗號分隔的服務器列表:

# test.py -s server1,server2 

,並分割你的腳本中的價值。

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) 
+0

這就是我想竟被工作也是如此。 但是我得到這個錯誤: AttributeError:'str'對象沒有屬性'追加' 當我給一個字符串選項的動作。 – jduncan 2010-05-03 11:14:28

+0

@jduncan:你確定嗎?我剛剛嘗試過,並且再次按預期工作。 – 2010-05-03 12:04:39

+0

如果我不指定任何選項 - options.test是None並且無法枚舉,我將無法使用它(Python 2.6) – 2010-05-03 15:40:37

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

相關問題