2010-05-03 15 views
6

Sto scrivendo un piccolo script python per ottenere statistiche da diversi server o un singolo server, e sto usando OptionParser per analizzare l'input da riga di comando.Modulo python OptionParser: più voci della stessa variabile?

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

il mio obiettivo è quello di essere in grado di fare qualcosa di simile

#test.py -s server1 -s server2 

e sarebbe aggiungere entrambi questi valori all'interno dell'oggetto options.server in qualche modo, in modo che potessi iterare attraverso di loro, se hanno 1 valore o 10.

Qualsiasi pensiero/aiuto è apprezzato. Grazie.

risposta

2

Si potrebbe provare a verificare argparse. Esso prevede il parametro "nargs" che significa che sarebbe in grado di fare qualcosa insieme

#test.py -s server1 server2 

So che non è esattamente quello che ha chiesto, ma che potrebbe essere un compromesso decente senza troppa fatica. :)

2

potrebbe essere più facile accettare un elenco separato da virgole dei server:

# test.py -s server1,server2 

e dividere il valore all'interno dello script.

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

Questo è quello che ho pensato woul d lavoro, pure. Tuttavia, ho ricevuto questo errore: AttributeError: l'oggetto 'str' non ha attributo 'append' quando fornisco un'opzione di stringa tale azione. – jduncan

+0

@jduncan: Sei sicuro? L'ho appena provato e di nuovo funziona come previsto. –

+0

Questo non funziona per me (Python 2.6) se non si specifica alcuna opzione - options.test è None e non può essere enumerata –

3

Sì, può essere fatto con optparse.

Questo è un esempio:

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

che stampa:

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

esempio funzionante completa di seguito:

#!/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() 

Maggiori informazioni su http://docs.python.org/library/optparse.html#adding-new-actions

Problemi correlati