2010-12-16 18 views
12

Ich schreibe ein Skript, das zwei Argumente hat, die sich gegenseitig ausschließen, und eine Option, die nur mit einem dieser Argumente sinnvoll ist. Ich versuche, argparse zum Scheitern zu bringen, wenn du es mit dem Argument nennst, das keinen Sinn ergibt.Python argparse mit Abhängigkeiten

Um klar zu sagen:

-m -f macht Sinn

-s macht Sinn

-s -f sollte

keine Argumente

Fehler auswerfen sind in Ordnung.

Der Code, den ich habe, ist:

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') 

Welche nicht funktioniert, wie es ausspuckt

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

eher als das, was ich erwarten würde:

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

oder sowas.

whichboom -s -f -m 116 

wirft auch keine Fehler.

Antwort

8

Sie haben gerade die Argumentgruppen gemischt. In Ihrem Code weisen Sie der sich gegenseitig ausschließenden Gruppe nur eine Option zu. Ich denke, was Sie wollen, ist:

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') 

Sie könnten nur die ganze Gruppe sich gegenseitig ausschließe Sache überspringen und so etwas wie hinzufügen:

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

Dies ist eine funktionale Problemumgehung. Ich werde es einrichten, um mit ungültigen Optionen zu bombardieren, aber ich fühle, dass es ein Klotz ist. Wenn ich es heute Morgen nicht sortiere, werde ich die Entwickler ärgern, es könnte ein Fehler sein. – richo

+0

Ich füge die mysql-Gruppe und eine weitere Option der wechselseitig_exklusiven_gruppe hinzu. Ich nehme an, ich habe die Option erwartet, die andere Gruppe auszuschließen, aber so funktioniert es nicht. Ich ging mit deiner anderen Lösung. – richo

+0

'Argumentgruppe' und' sich gegenseitig ausschließende Gruppe' haben sehr unterschiedliche Zwecke und können nicht sinnvoll verschachtelt werden. 'argument_group' bedeutet nicht" irgendeines der oben genannten ". – hpaulj

2

das usage Argument hinzufügen, wenn der Parser zu erstellen:

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

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

+1

Das am besten behebt die Befehlszeilendruck, ist es nicht unbreak die Funktionalität (das Programm akzeptiert einen ungültigen Argumentsatz) und bedeutet, dass ich diese Zeile von Hand pflegen muss. Die Verwendungslinie ist die geringste meiner Sorgen, ich habe sie hauptsächlich aufgenommen, falls es jemandem helfen würde zu verstehen, was passiert. – richo