2010-05-03 2 views
6

Я пишу небольшой скрипт python для получения статистики с нескольких серверов или одного сервера, и я использую OptionParser для синтаксического анализа ввода командной строки.Модуль 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.

Любые мысли/помощь приветствуются. Благодарю.

ответ

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

Вот что я думал, что woul d работы, а также. Тем не менее, я получаю эту ошибку: AttributeError: объект 'str' не имеет атрибута 'append' , когда я даю параметр строки, действие. – jduncan

+0

@jduncan: Вы уверены? Я просто попробовал, и снова он работает, как ожидалось. –

+0

Это не подходит для меня (Python 2.6), если я не укажу никаких опций - options.test - None и не может быть перечислит –

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

Смежные вопросы