argparse: identifiziert, welcher Subparser verwendet wurde [duplicate]
Lesezeit: 4 Minuten
Benutzer1062880
Ich denke, das muss einfach sein, aber ich verstehe es nicht.
Angenommen, ich habe den folgenden Arparse-Parser:
import argparse
parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')
# all
all_parser = subparsers.add_parser('all', help='process all apps')
# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
Wie kann ich erkennen, welcher Subparser verwendet wurde? Berufung:
print parser.parse_args(["all"])
gibt mir einen leeren Namensraum:
Namespace()
Diese Frage hat meiner Meinung nach eine bessere Antwort als die als ursprünglich angesehene.
– Eugen Sajine
26. Februar 2014 um 19:34 Uhr
Das vermeintliche Duplikat ist bei dieser Frage nicht hilfreich
– Benj
25. Mai 2019 um 17:16 Uhr
Eine einfachere Lösung ist das Hinzufügen dest zum add_subparsers Anruf. Dies ist etwas weiter unten in der begraben Dokumentation:
[…] Wenn es notwendig ist, den Namen des aufgerufenen Subparsers zu überprüfen, funktioniert das Argument des Schlüsselworts dest für den Aufruf add_subparsers()
Dies scheint der richtige Weg zu sein, da es wie folgt funktioniert dest param für jedes andere Argument (nur standardmäßig auf Noneanstatt aus dem gezogen zu werden --longopt Wert). Verwenden set_defaults scheint dafür ungeeignet (aber nützlich für andere Dinge)
– dbr
6. Juni 2012 um 12:01 Uhr
Das ist die richtige Antwort! Wäre schön, ein Beispiel zu haben, wie man den Wert “command” testet.
– Eugen Sajine
26. Februar 2014 um 19:16 Uhr
Übrigens, wenn es eine Funktion in derselben Klasse mit dem Namen des Befehls gibt, könnte man Folgendes tun: “getattr (self, args.command) ()”, um sie mit dem Namen auszuführen!
– Eugen Sajine
26. Februar 2014 um 19:32 Uhr
Kann ich den Subparser selbst irgendwie bekommen, anstatt nur seinen Namen?
– Herr_und_Frau_D
7. Juni 2017 um 15:19 Uhr
Beachten Sie, dass möglicherweise ein nicht offensichtliches Problem vorliegt: Wenn Sie ausführen .add_argument('--command')dh fügen Sie ein Argument hinzu, dessen Name mit dem übereinstimmt dest eins, dann Wert dieses Arguments (falls bestanden) überschreibt den Namen des Parsers. Ich denke, eine solche problematische Konfiguration sollte eigentlich von argparse erkannt werden, ist es aber leider nicht.
– Hallo Engel
30. November 2020 um 12:35 Uhr
srgerg
Bearbeiten: Bitte sehen Sie sich Quornians Antwort auf diese Frage an, die besser ist als meine und die akzeptierte Antwort sein sollte.
Laut dem argparse-Dokumentation das Ergebnis von parser.parse_args(...) enthält “nur Attribute für den Hauptparser und den ausgewählten Unterparser”. Leider reichen diese Informationen möglicherweise nicht aus, um festzustellen, welcher Unterparser verwendet wurde. Die Dokumentation empfiehlt die Verwendung des set_defaults(...) Methode auf dem Sub-Parser, um dieses Problem zu lösen.
Zum Beispiel habe ich Anrufe zu hinzugefügt set_defaults() zu deinem Code:
import argparse
parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')
# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which="all")
# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which="app")
Wenn Sie jetzt laufen
print parser.parse_args(["all"])
Das Ergebnis ist
Namespace(which="all")
Probier das aus add_subparsers() Dokumentation für weitere Informationen und ein weiteres Beispiel.
set_defaults ist nützlich, wie im Beispiel der Dokumentation, wo es verwendet wird, um einen Unterbefehl an eine Funktion zu binden … aber add_parser(dest='which') scheint der “richtige” Weg zu sein, da der Name des Unterbefehls nicht wiederholt werden muss
– dbr
6. Juni 2012 um 12:02 Uhr
@dbr Ja, du hast Recht. Quornians Antwort sollte die akzeptierte sein.
– srgerg
7. Juni 2012 um 0:23 Uhr
@dbr, sollte sein add_subparsers(dest='which')
– smac89
15. September 2017 um 1:54 Uhr
Diese Antwort ist eigentlich sehr hilfreich, da die von @quornian bereitgestellte Lösung einen Fehler bei der Verwendung von Aliasnamen aufweist. Der Alias befindet sich in der dest-Variablen, nicht im Befehlsnamen. Siehe auch stackoverflow.com/questions/59493715/…
– ypnos
23. Juli 2021 um 11:56 Uhr
10284000cookie-checkargparse: identifiziert, welcher Subparser verwendet wurde [duplicate]yes
Diese Frage hat meiner Meinung nach eine bessere Antwort als die als ursprünglich angesehene.
– Eugen Sajine
26. Februar 2014 um 19:34 Uhr
Das vermeintliche Duplikat ist bei dieser Frage nicht hilfreich
– Benj
25. Mai 2019 um 17:16 Uhr