2010-12-16 18 views
12

Estoy escribiendo un script que tiene 2 argumentos que son mutuamente excluyentes, y una opción que solo tiene sentido con uno de esos argumentos. Estoy intentando configurar argparse para que falle si lo llamas con el argumento que no tiene sentido.python argparse con dependencias

Para que quede claro:

-m -f tiene sentido

-s tiene sentido

-s -f debe tirar errores

sin argumentos están bien.

El código que tengo es:

parser = argparse.ArgumentParser(description='Lookup servers by ip address from host file') 
parser.add_argument('host', nargs=1, 
      help="ip address to lookup") 
main_group = parser.add_mutually_exclusive_group() 
mysql_group = main_group.add_argument_group() 
main_group.add_argument("-s", "--ssh", dest='ssh', action='store_true', 
      default=False, 
      help='Connect to this machine via ssh, instead of printing hostname') 
mysql_group.add_argument("-m", "--mysql", dest='mysql', action='store_true', 
      default=False, 
      help='Start a mysql tunnel to the host, instead of printing hostname') 
mysql_group.add_argument("-f", "--firefox", dest='firefox', action='store_true', 
      default=False, 
      help='Start a firefox session to the remotemyadmin instance') 

que no funciona, ya que escupe

usage: whichboom [-h] [-s] [-m] [-f] host 

en lugar de lo que cabe esperar:

usage: whichboom [-h] [-s | [-h] [-s]] host 

o somesuch.

whichboom -s -f -m 116 

no arroja ningún error.

Respuesta

8

Acabas de los grupos de argumentos mezclado. En su código, solo asigna una opción al grupo mutuamente exclusivo. Creo que lo que quiere es:

parser = argparse.ArgumentParser(description='Lookup servers by ip address from host file') 
parser.add_argument('host', nargs=1, 
      help="ip address to lookup") 
main_group = parser.add_mutually_exclusive_group() 
mysql_group = main_group.add_argument_group() 
main_group.add_argument("-s", "--ssh", dest='ssh', action='store_true', 
      default=False, 
      help='Connect to this machine via ssh, instead of printing hostname') 
mysql_group.add_argument("-m", "--mysql", dest='mysql', action='store_true', 
      default=False, 
      help='Start a mysql tunnel to the host, instead of printing hostname') 
main_group.add_argument("-f", "--firefox", dest='firefox', action='store_true', 
      default=False, 
      help='Start a firefox session to the remotemyadmin instance') 

Se podía saltar todo el asunto grupo mutuamente excluyentes y añadir algo como esto:

usage = 'whichboom [-h] [-s | [-h] [-s]] host' 
parser = argparse.ArgumentParser(description, usage) 
options, args = parser.parse_args() 
if options.ssh and options.firefox: 
    parser.print_help() 
    sys.exit() 
+1

Esta es una solución funcional. Lo configuraré para bombardear con opciones inválidas, pero siento que es un error. Si no puedo resolverlo esta mañana voy a molestar a los desarrolladores, puede ser un error. – richo

+0

Agrego el grupo mysql y una opción más al grupo mutuamente excluyente. Supongo que esperaba la opción de excluir al otro grupo, pero no es así como funciona. Terminé yendo con tu otra solución. – richo

+0

'grupo de argumentos' y' grupo mutuamente exclusivo' tienen propósitos muy diferentes, y no se pueden anidar de manera significativa. 'argument_group' no significa' cualquiera de los anteriores'. – hpaulj

2

Añadir el argumento usage al crear el programa de análisis:

usage = "usage: whichboom [-h] [-s | [-h] [-s]] host" 
description = "Lookup servers by ip address from host file" 
parser = argparse.ArgumentParser(description=description, usage=usage) 

Fuente: http://docs.python.org/dev/library/argparse.html#usage

+1

Esto en el mejor de la impresión fija la línea de comandos, no unbreak la funcionalidad (el programa acepta un conjunto de argumentos no válido) y significa que tengo que mantener esa línea a mano ... la línea de uso es la menor de mis preocupaciones, la incluí principalmente en caso de que ayudara a alguien a entender lo que está sucediendo. – richo

Cuestiones relacionadas