916 Stimmen

Argparse optionale positionale Argumente?

Ich habe ein Skript, das auf diese Weise verwendet werden soll: usage: installer.py dir [-h] [-v]

dir ist ein Positionsargument, das wie folgt definiert ist:

parser.add_argument('dir', default=os.getcwd())

Ich möchte die dir optional sein: Wenn es nicht angegeben ist, sollte es einfach cwd .

Wenn ich leider nicht die dir Argument, erhalte ich Error: Too few arguments .

1187voto

Vinay Sajip Punkte 89444

Utilice nargs='?' (oder nargs='*' wenn Sie mehr als ein Verzeichnis benötigen)

parser.add_argument('dir', nargs='?', default=os.getcwd())

erweitertes Beispiel:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

35 Stimmen

Machen Sie die ? y * dasselbe bedeuten wie in regulären Ausdrücken (d. h. ? erfordert 0 oder 1, und * die 0 oder mehr erfordern)? Wenn ja, muss + auch funktionieren?

56 Stimmen

@dolan: Ja, + funktioniert auch. Siehe docs.python.org/2/library/argparse.html#nargs für die Einzelheiten.

4 Stimmen

Gibt es irgendeine Möglichkeit, dir zu bekommen, um in optionalen Argumenten zu zeigen? oder es scheint, dass Positionsargumente einen vorangestellten "optionalen" Qualifizierer haben sollten. ist es möglich, zu registrieren (soweit Hilfe betroffen ist) es als solche?

101voto

Matas Vaitkevicius Punkte 53532

Als Ergänzung zur Antwort von @VinaySajip. Es gibt zusätzliche nargs erwähnenswert .

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N (eine ganze Zahl). N Argumente aus der Befehlszeile werden in einer Liste zusammengefasst

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'. Alle vorhandenen Befehlszeilenargumente werden in einer Liste zusammengefasst. Hinweis dass es im Allgemeinen nicht viel Sinn macht, mehr als ein Positionsargument zu haben mit nargs='*' , aber mehrere optionale Argumente mit nargs='*' ist möglich.

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

'+'. Genau wie bei '*' werden alle vorhandenen Befehlszeilen-Args in einer Liste zusammengefasst. Zusätzlich wird eine Fehlermeldung erzeugt, wenn nicht mindestens ein Befehlszeilenargument vorhanden war.

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER . Alle übrigen Befehlszeilenargumente werden in einer Liste zusammengefasst. Dies ist in der Regel nützlich für Kommandozeilenprogramme, die an andere Kommandozeilenprogramme weiterleiten

Wenn die nargs Schlüsselwortargument nicht angegeben wird, wird die Anzahl der Argumente durch die Aktion bestimmt. Im Allgemeinen bedeutet dies, dass ein einzelnes Befehlszeilenargument verbraucht wird und ein einzelnes Element (keine Liste) erzeugt wird.

Bearbeiten (kopiert von einem Kommentar von @Acumenus) nargs='?' Die Dokumente sagen: '?'. Wenn möglich, wird ein Argument aus der Befehlszeile übernommen und als ein einziges Element ausgegeben. Wenn kein Befehlszeilenargument vorhanden ist, wird der Wert aus der Voreinstellung erzeugt.

3 Stimmen

Es ist jedoch zu beachten, dass nargs='?' erzeugt keine Liste.

0 Stimmen

@A-B-B Letzte Zeile der Antwort Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced. Ich hoffe, das hilft...

1 Stimmen

Die zitierte Zeile bezieht sich auf den Fall, dass keine Definition nargs aber nargs='?' definiert sie. Die docs sagen: '?'. Wenn möglich, wird ein Argument aus der Befehlszeile übernommen und als ein einziges Element ausgegeben. Ist kein Befehlszeilenargument vorhanden, wird der Wert aus der Voreinstellung erzeugt.

26voto

FiddleStix Punkte 1902

Kurze Antwort

Wie bereits in den beiden vorangegangenen Antworten gezeigt, können Sie ein optionales Positionsargument mit nargs='?' . Sie könnten das Argument auch direkt in eine Path eingeben und/oder den cwd auf . wenn Sie das wollten:

meineDatei.py

import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument("dir", nargs="?", default=".", type=pathlib.Path)
parsed_args = parser.parse_args()

print("Installing to", parsed_args.dir.resolve())

$ python myfile.py
Installing to /users/myname/myfolder

$ python myfile.py /usr/bin/
Installing to /usr/bin

Längere Antwort

Da Sie auch die Wahr/Falsch-Optionen im Flaggenstil erwähnen -h y -v in Ihrer Frage, können diese Beispiele von Nutzen sein:

Flaggen (z.B. -v )

Optionale Optionen, die keine Argumente benötigen, können wir als "Flags" bezeichnen. Bei Flags interessiert uns nur, ob sie gegeben sind oder nicht. -h ist ein Flag, das argparse automatisch hinzufügt (zusammen mit der längeren Version --help ), also sollten wir das nicht wirklich außer Kraft setzen. Wenn wir berücksichtigen -v dann,

meineDatei.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument(
        "-v",
        "--version",
        action="store_true")
parsed_args = parser.parse_args()

if parsed_args.version:
    print("version flag given")
else:
    print("version flag not given")

Beachten Sie, dass das zweite Argument von add_argument() ist ein längerer Name für diese Option. Sie ist nicht obligatorisch, aber sie macht Ihren nachfolgenden Code lesbarer ( parsed_args.version gegen parsed_args.v ) und macht die Aufrufe an Ihr Installationsprogramm deutlicher.

$ python myfile.py -v
version flag given

$ python myfile.py --verbose
version flag given

$ python myfile.py
version flag not given

Optionale Argumente (z. B. --installdir /usr/bin/ )

Man könnte argumentieren, dass Sie in Ihrem Fall mit einem fakultativen Argument besser dran wären als mit einem positionsbezogenen.

meineDatei.py

import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument(
        "-i",
        "--installdir",  # Optional (but recommended) long version
        type=pathlib.Path,
        default="/bin"
        )
parsed_args = parser.parse_args()

print("Installing to", parsed_args.installdir)

$ python myfile.py -i /usr/bin/
Installing to /usr/bin

$ python myfile.py -installdir /usr/bin/
Installing to /usr/bin

$ python myfile.py
Installing to /bin

-12voto

rakhee Punkte 111

parser.add_argument hat auch einen Schalter erforderlich . Sie können verwenden required=False . Hier ist ein Beispielschnipsel mit Python 2.7:

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()

19 Stimmen

Der Auftraggeber fragte nach Positionsparametern, nicht nach '--dir'. required' ist ein ungültiges Argument für Positionsparameter. Und 'false' war ein Tippfehler, sie meinte 'False'. +1 für Neuling, -1 für Schlampigkeit.

1 Stimmen

Wir können nicht verwenden required für das Argument der Position.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X