argparse: identifiziert, welcher Subparser verwendet wurde [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
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()

Ersetzen Sie in Ihrem Beispiel:

subparsers = parser.add_subparsers(help='commands')

mit:

subparsers = parser.add_subparsers(help='commands', dest="command")

Wenn Sie jetzt laufen:

print parser.parse_args(["all"])

Sie erhalten

Namespace(command='all')

  • 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


Benutzer-Avatar
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

1028400cookie-checkargparse: identifiziert, welcher Subparser verwendet wurde [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy