2010-05-03 4 views
6

J'écris un petit script python pour obtenir des statistiques de plusieurs serveurs ou d'un seul serveur, et j'utilise OptionParser pour analyser l'entrée de la ligne de commande.Module OptionParser python - plusieurs entrées de la même variable?

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

mon objectif est d'être en mesure de faire quelque chose comme

#test.py -s server1 -s server2 

et il ajoutera ces deux valeurs dans l'objet options.server d'une certaine façon pour que je puisse itérer eux, que ce soit ils ont 1 valeur ou 10.

Toute idée/aide est appréciée. Merci.

Répondre

2

Vous pouvez essayer de vérifier argparse. Il fournit des paramètres « nargs » qui signifie que vous seriez en mesure de faire quelque chose le long

#test.py -s server1 server2 

Je sais que ce n'est pas exactement ce qui a demandé, mais il pourrait être un bon compromis sans trop de tracas. :)

2

Peut-être plus facile d'accepter une liste séparée par des virgules des serveurs:

# test.py -s server1,server2 

et diviser la valeur de votre 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

C'est ce que je pensais woul d travail, aussi bien. Cependant, j'obtiens cette erreur: AttributeError: l'objet 'str' n'a pas d'attribut 'append' lorsque je donne une action de type chaîne. – jduncan

+0

@jduncan: Etes-vous sûr? Je l'ai juste essayé et encore une fois cela fonctionne comme prévu. –

+0

Cela échoue pour moi (Python 2.6) si je ne spécifie aucune option - options.test est None et ne peut pas être énuméré –

3

Oui, il peut être fait avec optparse.

Voici un exemple:

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

qui imprime:

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

exemple de travail complet ci-dessous:

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

Plus d'informations sur http://docs.python.org/library/optparse.html#adding-new-actions

Questions connexes