2010-05-03 13 views
6

Estoy escribiendo un pequeño script de python para obtener estadísticas de varios servidores o un solo servidor, y estoy usando OptionParser para analizar la entrada de la línea de comandos.Módulo OptionParser python: ¿entradas múltiples de la misma 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]") 
... 

Mi objetivo es ser capaz de hacer algo como

#test.py -s server1 -s server2 

y sería añadir estos dos valores dentro del objeto options.server de alguna manera para que pudiera recorrer a través de ellos, ya sea tienen 1 valor o 10.

Se agradecen todos los pensamientos/ayuda. Gracias.

Respuesta

2

Puede intentar consultar argparse. Proporciona parámetro "nargs" lo que significa que sería capaz de hacer algo junto

#test.py -s server1 server2 

Yo sé que no es exactamente lo que solicitó, pero que podría ser un compromiso decente sin demasiados problemas. :)

2

podría ser más fácil de aceptar una lista separada por comas de los servidores:

# test.py -s server1,server2 

y dividir el valor dentro de su guión.

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

Eso es lo que pensaba woul d trabajo, también. Sin embargo me sale este error: AttributeError: el objeto 'str' no tiene ningún atributo 'anexar' cuando le doy a una opción de cadena esa acción. – jduncan

+0

@jduncan: ¿Estás seguro? Lo intenté y nuevamente funciona como esperaba. –

+0

Esto falla para mí (Python 2.6) si no especifico ninguna opción - options.test es None y no se puede enumerar –

3

Sí, se puede hacer con optparse.

Este es un ejemplo:

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

que imprime:

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

ejemplo de trabajo completa a continuación:

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

Más información en http://docs.python.org/library/optparse.html#adding-new-actions

Cuestiones relacionadas