Wie kann ich Befehlszeilenargumente lesen und verarbeiten (parsen)?
Lesezeit: 8 Minuten
Wie können wir in Python die für ein Skript bereitgestellten Befehlszeilenargumente herausfinden und verarbeiten?
Zugehörige Hintergrundlektüre: Was bedeutet “sys.argv[1]” bedeuten? (Was ist sys.argv, und woher kommt es?). Einige spezifischere Beispiele finden Sie unter Implementieren eines “[command] [action] [parameter]” Befehlszeilenschnittstellen im Stil? und Wie formatiere ich die Hilfe für Positionsargumente mit Pythons optparse?.
Verwenden Sie docopt (siehe die Antwort von @ralbatross unter stackoverflow.com/a/14790373/116891). Ich habe es mit allen anderen Methoden versucht und wirklich, docopt ist die einzige, die ich in Zukunft verwenden werde.
– Pat
21. Oktober 2013 um 2:50 Uhr
Ich glaube nicht, dass es einen einzigen besten Weg gibt. argparse ist Standard und funktionsreich. docopt ist sehr elegant, aber nicht in der Standardbibliothek. Für eine sehr einfache, leichte Verwendung können Sie festlegen, dass Funktionsstandardwerte die Standardwerte für Befehlszeilenargumente für Sie verarbeiten.
– Simon Hibbs
5. April 2017 um 15:27 Uhr
John Slavick
import sys
print("\n".join(sys.argv))
sys.argv ist eine Liste, die alle Argumente enthält, die auf der Befehlszeile an das Skript übergeben werden. sys.argv[0] ist der Name des Skripts.
Grundsätzlich,
import sys
print(sys.argv[1:])
Für wirklich einfache Dinge ist dies der richtige Weg, obwohl Sie wahrscheinlich nur verwenden möchten sys.argv[1:] (vermeidet den Skriptnamen).
– Xiong Tschamiow
12. September 2010 um 7:31 Uhr
Ayman Hourieh
Die kanonische Lösung in der Standardbibliothek ist argparse (Dokumente):
Hier ist ein Beispiel:
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parser.add_argument("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")
args = parser.parse_args()
argparse unterstützt (unter anderem):
Mehrere Optionen in beliebiger Reihenfolge.
Kurze und lange Optionen.
Standardwerte.
Generierung einer Nutzungshilfenachricht.
Ja, das sind die besten. Da sie Teil der Standardbibliothek sind, können Sie sicher sein, dass sie verfügbar und einfach zu verwenden sind. Insbesondere optparse ist leistungsfähig und einfach.
– Barry Wark
17. Juni 2009 um 22:43 Uhr
optparse ist einer der besten; getopt ist alt und sollte wirklich als veraltet betrachtet werden.
– Prachtfink
9. April 2010 um 20:49 Uhr
An diesem Punkt (12/2011) wird argparse jetzt als bessere Option angesehen als optparse, richtig?
– ooh
20. Dezember 2011 um 21:48 Uhr
Die Python-Dokumentation schlägt die Verwendung von vor argparse statt optparse.
– Erdmelone
22. Mai 2012 um 15:45 Uhr
Seit optparse ist veraltet, der Fragesteller ist kein Mitglied mehr bei Stapelüberlauf, und dies ist die akzeptierte Antwort auf eine gut sichtbare Frage – bitte erwägen Sie, Ihren Beispielcode vollständig umzuschreiben, um stdlib zu verwenden argparse stattdessen.
– Wim
23. Mai 2018 um 17:13 Uhr
Einfach herumlaufen und evangelisieren argparse was ist besser für diese Gründe.. im Wesentlichen:
(aus dem Link kopiert)
Das argparse-Modul kann Positionsargumente und optionale Argumente verarbeiten, während das optparse-Modul nur optionale Argumente verarbeiten kann
argparse ist nicht dogmatisch, wie Ihre Befehlszeilenschnittstelle aussehen sollte – Optionen wie -file oder /file werden unterstützt, ebenso wie erforderliche Optionen. Optparse weigert sich, diese Funktionen zu unterstützen, und zieht Reinheit der Praktikabilität vor
argparse erzeugt informativere Verwendungsmeldungen, einschließlich der aus Ihren Argumenten ermittelten Befehlszeilenverwendung, und Hilfemeldungen für sowohl positionelle als auch optionale Argumente. Das optparse-Modul erfordert, dass Sie Ihre eigene Verwendungszeichenfolge schreiben, und hat keine Möglichkeit, Hilfe für Positionsargumente anzuzeigen.
argparse unterstützt Aktionen, die eine variable Anzahl von Befehlszeilenargumenten verbrauchen, während optparse erfordert, dass die genaue Anzahl von Argumenten (z. B. 1, 2 oder 3) im Voraus bekannt ist
argparse unterstützt Parser, die an Unterbefehle weiterleiten, während optparse eine Einstellung erfordert allow_interspersed_args und den Parser-Versand manuell durchführen
Und mein persönlicher Favorit:
argparse lässt die Typ- und Aktionsparameter zu add_argument()
mit einfachen Callables angegeben werden, während optparse das Hacken von Klassenattributen wie erfordert STORE_ACTIONS oder CHECK_METHODS um eine korrekte Argumentüberprüfung zu erhalten
Dies ist jetzt Teil von Standard-Python ab 2.7 und 3.2 🙂
– jpswain
3. September 2010 um 2:08 Uhr
Was sind “optionale Argumente”? Sie sagen, sie sind in optparse. Ich dachte, dass es sich um Argumente handelt, die möglicherweise bereitgestellt werden oder nicht, aber Sie sagten, dass sie in optparse sind, während Sie weiter sagten, dass “optparse erfordert, dass die genaue Anzahl der Argumente im Voraus bekannt ist”. Entweder unterscheidet sich Ihre Definition von “optionalem Argument” von dem, was ich dachte, oder Ihre Antwort stimmt nicht mit sich selbst überein.
– ArtOfWarfare
7. August 2014 um 12:44 Uhr
Nur ein Kritikpunkt: Die argparse-Dokumentation ist auch wahnsinnig, wahnsinnig kompliziert. Sie können keine einfache Antwort auf “Wie bringe ich ein Befehlszeilenargument dazu, einen einzelnen Wert aufzunehmen, und wie greife ich auf diesen Wert zu?”
– osman
13. April 2017 um 19:09 Uhr
@osman Das ist sanft Lernprogramm auf argparse könnte helfen …
– Lebensbalance
13. Juni 2017 um 15:51 Uhr
@ArtOfWarfare “optionale Argumente” bedeutet in diesem Zusammenhang vermutlich Argumente, die mit optionalen Argumenten wie angegeben werden -f oder --foowährend “genaue Anzahl von Argumenten im Voraus bekannt sein” vermutlich Positionsargumente bedeutet, die ohne vorangestellte Optionsflags angegeben werden.
Eine realistischere Verwendung wäre python main.py "James Smith" was bringt James Smith In sys.argv[1] und produziert ein IndexError wenn Sie versuchen, das Nichtexistente zu verwenden sys.argv[2]. Das Zitierverhalten hängt etwas davon ab, von welcher Plattform und Shell Sie Python ausführen.
– Dreier
22. Dezember 2017 um 8:02 Uhr
Ich stimme nicht zu, dass meine Verwendung weniger realistisch ist. Stellen Sie sich vor, Ihr Programm müsste den genauen Vor- und Nachnamen einer Person kennen, um das Skript in einem Unternehmen auszuführen, in dem Personen mehrere Vor- und Nachnamen haben können? Wenn James Smith Joseph als zusätzlichen Vor- oder Nachnamen hat, wie würden Sie dann unterscheiden, ob Joseph ein zusätzlicher Vor- oder Nachname ist, wenn Sie dies nur tun python main.py "James Joseph Smith"? Wenn Sie Bedenken haben, dass der Index außerhalb der Grenzen liegt, können Sie eine Prüfung für die Anzahl der bereitgestellten Argumente hinzufügen. Weniger realistisch oder nicht, mein Beispiel zeigt, wie man mit mehreren Argumenten umgeht.
– Kent Munthe Caspersen
1. Januar 2018 um 19:55 Uhr
Alle anderen Antworten beziehen sich auf die Planung einer Mondlandemission. Ich benutze einfach nur gmail-trash-msg.py MessageID. Diese Antwort ist direkt zu testen MessageID Parameter übergeben wurde sys.argv[1].
– WinEunuuchs2Unix
22. Mai 2019 um 23:27 Uhr
Peter Mortensen
Eine Möglichkeit, dies zu tun, ist die Verwendung sys.argv. Dadurch wird der Skriptname als erstes Argument und alle anderen Parameter ausgegeben, die Sie ihm übergeben.
import sys
for arg in sys.argv:
print arg
Eine realistischere Verwendung wäre python main.py "James Smith" was bringt James Smith In sys.argv[1] und produziert ein IndexError wenn Sie versuchen, das Nichtexistente zu verwenden sys.argv[2]. Das Zitierverhalten hängt etwas davon ab, von welcher Plattform und Shell Sie Python ausführen.
– Dreier
22. Dezember 2017 um 8:02 Uhr
Ich stimme nicht zu, dass meine Verwendung weniger realistisch ist. Stellen Sie sich vor, Ihr Programm müsste den genauen Vor- und Nachnamen einer Person kennen, um das Skript in einem Unternehmen auszuführen, in dem Personen mehrere Vor- und Nachnamen haben können? Wenn James Smith Joseph als zusätzlichen Vor- oder Nachnamen hat, wie würden Sie dann unterscheiden, ob Joseph ein zusätzlicher Vor- oder Nachname ist, wenn Sie dies nur tun python main.py "James Joseph Smith"? Wenn Sie Bedenken haben, dass der Index außerhalb der Grenzen liegt, können Sie eine Prüfung für die Anzahl der bereitgestellten Argumente hinzufügen. Weniger realistisch oder nicht, mein Beispiel zeigt, wie man mit mehreren Argumenten umgeht.
– Kent Munthe Caspersen
1. Januar 2018 um 19:55 Uhr
Alle anderen Antworten beziehen sich auf die Planung einer Mondlandemission. Ich benutze einfach nur gmail-trash-msg.py MessageID. Diese Antwort ist direkt zu testen MessageID Parameter übergeben wurde sys.argv[1].
– WinEunuuchs2Unix
22. Mai 2019 um 23:27 Uhr
ralbatros
Der Arzt Bibliothek ist wirklich glatt. Es erstellt ein Argument dict aus der Nutzungszeichenfolge für Ihre App.
Das hat sich schnell zu meinem Lieblingsweg entwickelt. Es ist String-Parsing, also ist es etwas spröde, aber es ist spröde alles an einem Ort und Sie können Ihre Logik unter anzeigen try.docopt.org . Optionale und sich gegenseitig ausschließende Argumente werden auf wirklich elegante Weise ausgeführt.
– gvoysee
29. März 2016 um 3:34 Uhr
14491100cookie-checkWie kann ich Befehlszeilenargumente lesen und verarbeiten (parsen)?yes
Verwenden Sie docopt (siehe die Antwort von @ralbatross unter stackoverflow.com/a/14790373/116891). Ich habe es mit allen anderen Methoden versucht und wirklich, docopt ist die einzige, die ich in Zukunft verwenden werde.
– Pat
21. Oktober 2013 um 2:50 Uhr
Ich glaube nicht, dass es einen einzigen besten Weg gibt. argparse ist Standard und funktionsreich. docopt ist sehr elegant, aber nicht in der Standardbibliothek. Für eine sehr einfache, leichte Verwendung können Sie festlegen, dass Funktionsstandardwerte die Standardwerte für Befehlszeilenargumente für Sie verarbeiten.
– Simon Hibbs
5. April 2017 um 15:27 Uhr