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

Benutzeravatar von John Slavick
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


Benutzeravatar von Ayman Hourieh
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.

    – mtraceur

    25. Juli 2018 um 23:55 Uhr

Benutzeravatar von jfs
jfs

Es gibt auch argparse stdlib-Modul (eine “Verbesserung” von stdlib’s optparse Modul). Beispiel aus die Einführung in argparse:

# script.py
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'integers', metavar="int", type=int, choices=range(10),
         nargs="+", help='an integer in the range 0..9')
    parser.add_argument(
        '--sum', dest="accumulate", action='store_const', const=sum,
        default=max, help='sum the integers (default: find the max)')

    args = parser.parse_args()
    print(args.accumulate(args.integers))

Verwendung:

$ script.py 1 2 3 4
4

$ script.py --sum 1 2 3 4
10

Benutzeravatar von Kent Munthe Caspersen
Kent Munthe Caspersen

Wenn Sie etwas schnelles brauchen und nicht sehr flexibel sind

main.py:

import sys

first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)

Dann renne python main.py James Smith

um die folgende Ausgabe zu erzeugen:

Hallo JamesSmith

  • 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

Benutzeravatar von Peter Mortensen
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

Benutzeravatar von ralbatross
ralbatros

Der Arzt Bibliothek ist wirklich glatt. Es erstellt ein Argument dict aus der Nutzungszeichenfolge für Ihre App.

ZB aus der Docopt-Readme:

"""Naval Fate.

Usage:
  naval_fate.py ship new <name>...
  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
  naval_fate.py ship shoot <x> <y>
  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
  naval_fate.py (-h | --help)
  naval_fate.py --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --speed=<kn>  Speed in knots [default: 10].
  --moored      Moored (anchored) mine.
  --drifting    Drifting mine.

"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='Naval Fate 2.0')
    print(arguments)

  • 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


1449110cookie-checkWie kann ich Befehlszeilenargumente lesen und verarbeiten (parsen)?

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

Privacy policy