2010-05-03 1 views
6

Ich schreibe ein kleines Python-Skript, um Statistiken von mehreren Servern oder einem einzelnen Server zu erhalten, und ich verwende OptionParser, um die Eingabe in der Befehlszeile zu analysieren.OptionParser Python-Modul - mehrere Einträge derselben Variablen?

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

mein Ziel ist es, so etwas wie

#test.py -s server1 -s server2 

zu tun, und es wäre in gewisser Weise diese beiden Werte innerhalb des options.server Objekt anhängen, so dass ich sie durchlaufen konnte, ob sie haben 1 Wert oder 10.

Irgendwelche Gedanken/Hilfe wird geschätzt. Vielen Dank.

Antwort

2

Sie könnten versuchen, argparse zu überprüfen. Es bietet „nargs“ Parameter bedeutet, dass Sie etwas wäre in der Lage entlang

#test.py -s server1 server2 

zu tun, ich weiß, das ist nicht genau das, was angefordert, aber es könnte ein anständiger Kompromiss ohne allzu viel Aufwand sein. :)

2

könnte einfacher sein, eine durch Kommata getrennte Liste von Servern zu akzeptieren:

# test.py -s server1,server2 

und teilen Sie den Wert in Ihrem Skript.

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

Das ist, was ich dachte, woul Ich arbeite auch. Allerdings bekomme ich diesen Fehler: AttributeError: 'str' Objekt hat kein Attribut 'append' wenn ich eine Zeichenfolge Option diese Aktion geben. – jduncan

+0

@jduncan: Bist du sicher? Ich habe es gerade ausprobiert und es funktioniert wieder wie erwartet. –

+0

Dies scheitert für mich (Python 2.6), wenn ich keine Optionen angeben - options.test ist None und kann nicht aufgezählt werden –

3

Ja, es kann mit optparse erfolgen.

Dies ist ein Beispiel:

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

die druckt:

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

Vollarbeits Beispiel unten:

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

Weitere Informationen unter http://docs.python.org/library/optparse.html#adding-new-actions