Ich versuche ein Cli zu erstellen.

Ich hätte gerne irgendwann diese Funktionalisten:

  • myProgram create id name file
  • myProgram delete id
  • myProgram update id file

Das habe ich bisher.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('mode')
subparsers = parser.add_subparsers()
parser_delete = subparsers.add_parser('delete')
parser_delete.add_argument('id')
print parser.parse_args()

Wenn ich jedoch einen solchen Befehl gebe,

myProgram deelte 123

Ich bekomme

Namespace<id='123', mode='mode'>

Beachten Sie, dass der Modus NICHT "Löschen" ist.

Stattdessen muss ich einfügen

myProgram delete delete 123

Bekommen

Namespace<id='123', mode='delete'>

Ich wundere mich warum?

0
user1486030 3 Dez. 2013 im 01:46

3 Antworten

Beste Antwort

Sie müssen dem Aufruf parser.add_subparsers() ein Schlüsselwort dest hinzufügen und das Argument mode weglassen:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='mode')

Jetzt ist der Subparser-Name als mode enthalten:

$ cat test.py 
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='mode')
parser_delete = subparsers.add_parser('delete')
parser_delete.add_argument('id')
print parser.parse_args()

$ python test.py delete 123
Namespace(id='123', mode='delete')

Lesen Sie die Dokumentation zu Unterbefehlen jedoch genauer durch. Es gibt bessere Optionen, einschließlich der Zuordnung einer Funktion, die jedem Subparser aufgerufen werden soll, damit Sie den Namen des Subparsers nicht explizit wie folgt verfolgen müssen.

2
Martijn Pieters 2 Dez. 2013 im 21:57

Sie haben ein Argument und einen Subparser sowie ein Argument für diesen Subparser hinzugefügt. Das sind drei Argumente.

Wenn Sie möchten, dass der "Modus" das ist, was den Subparser auswählt, brauchen Sie das nicht. es ist das, was automatisch passiert. Entfernen Sie das add_argument('mode') und Sie können es als myProgram delete 123 ausführen.

Wenn Sie den Wert des Subparsers als mode -Wert im Namespace abrufen möchten, fügen Sie dem add_subparsers -Aufruf einfach dest='mode' hinzu.

0
abarnert 2 Dez. 2013 im 21:49

Wenn Sie nur die Argumente lesen möchten, die Sie in der Befehlszeile eingegeben haben, verwenden Sie Pythons sys.argv

Wenn Sie das Skript args.py wie folgt aufrufen:

$ args.py delete 123

Args.py sollte folgendermaßen aussehen:

import sys

print sys.argv[1] # Prints delete
print sys.argv[2] # Prints 123
-2
ffledgling 2 Dez. 2013 im 21:49