197 Stimmen

sys.argv[1] Bedeutung im Skript

Ich bin derzeit selbst Python zu lehren und war gerade fragen (in Bezug auf mein Beispiel unten) in vereinfachter Form, was die sys.argv[1] vertritt. Bittet sie einfach um eine Eingabe?

#!/usr/bin/python3.1

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
  print ('Hello there', sys.argv[1])
  # Command line args are in sys.argv[1], sys.argv[2] ..
  # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
  main()

3 Stimmen

Dies ist nicht Teil der Frage, und es ist sehr alt, aber das Modul argparse ist wahrscheinlich besser geeignet für das, was Sie vorhaben, und zwar nach diese

414voto

Jason R. Coombs Punkte 38667

Ich möchte anmerken, dass frühere Antworten viele Annahmen über das Wissen des Benutzers enthielten. Diese Antwort versucht, die Frage auf einer eher tutoriellen Ebene zu beantworten.

Bei jedem Aufruf von Python, sys.argv ist automatisch eine Liste von Zeichenketten, die die Argumente (durch Leerzeichen getrennt) in der Befehlszeile darstellen. Der Name kommt von der C-Programmierkonvention in dem argv und argc die Befehlszeilenargumente darstellen.

Sie werden mehr über Listen und Strings lernen wollen, wenn Sie sich mit Python vertraut machen, aber in der Zwischenzeit sind hier ein paar Dinge, die Sie wissen sollten.

Sie können einfach ein Skript erstellen, das die Argumente so ausgibt, wie sie dargestellt werden. Es gibt auch die Anzahl der Argumente aus, indem es die len Funktion auf der Liste.

from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))

Das Skript erfordert Python 2.6 oder höher. Wenn Sie dieses Skript aufrufen print_args.py können Sie es mit verschiedenen Argumenten aufrufen, um zu sehen, was passiert.

> python print_args.py
['print_args.py'] 1

> python print_args.py foo and bar
['print_args.py', 'foo', 'and', 'bar'] 4

> python print_args.py "foo and bar"
['print_args.py', 'foo and bar'] 2

> python print_args.py "foo and bar" and baz
['print_args.py', 'foo and bar', 'and', 'baz'] 4

Wie Sie sehen können, enthalten die Befehlszeilenargumente den Skriptnamen, aber nicht den Interpreternamen. In diesem Sinne behandelt Python das Skript als die ausführbare Datei. Wenn Sie den Namen der ausführbaren Datei (in diesem Fall python) wissen müssen, können Sie sys.executable .

Aus den Beispielen können Sie ersehen, dass es möglich ist, Argumente zu erhalten, die Leerzeichen enthalten, wenn der Benutzer das Skript mit in Anführungszeichen eingeschlossenen Argumenten aufruft, so dass Sie die Liste der Argumente erhalten, wie sie vom Benutzer geliefert wurde.

In Ihrem Python-Code können Sie nun diese Liste von Zeichenketten als Eingabe für Ihr Programm verwenden. Da Listen durch null-basierte Ganzzahlen indiziert sind, können Sie die einzelnen Elemente mit der list[0]-Syntax abrufen. Zum Beispiel, um den Skriptnamen zu erhalten:

script_name = sys.argv[0] # this will always work.

Obwohl es interessant ist, brauchen Sie Ihren Skriptnamen nur selten zu kennen. Um das erste Argument nach dem Skript für einen Dateinamen zu erhalten, könnten Sie Folgendes tun:

filename = sys.argv[1]

Dies ist eine sehr häufige Verwendung, aber beachten Sie, dass sie mit einem IndexError fehlschlägt, wenn kein Argument übergeben wurde.

Außerdem können Sie in Python auf ein Stück einer Liste verweisen, um also weitere Liste nur die vom Benutzer eingegebenen Argumente (aber ohne den Skriptnamen), können Sie

user_args = sys.argv[1:] # get everything after the script name

Außerdem können Sie in Python Variablennamen eine Folge von Elementen (einschließlich Listen) zuweisen. Wenn Sie also erwarten, dass der Benutzer immer zwei Argumente liefert, können Sie diese Argumente (als Zeichenketten) zwei Variablen zuweisen:

user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2

Um also auf Ihre konkrete Frage zu antworten, sys.argv[1] steht für das erste Befehlszeilenargument (als string ) an das betreffende Skript geliefert. Es fragt nicht nach Eingaben, schlägt aber mit einem IndexError fehl, wenn in der Befehlszeile nach dem Skriptnamen keine Argumente angegeben werden.

1 Stimmen

Wenn Sie die Liste der Zeichenketten anzeigen sys.argv Ich frage mich, was die Linie from __future__ import print_function tut. Ist es etwas, das ich hinzufügen muss, wenn ich NICHT läuft auf Python 3, aber Python 2? @Jason R. Coombs

1 Stimmen

@NicholasLiu, Sie müssen es nicht hinzufügen, wenn Sie Python 3 verwenden. Ich habe es nur der Vollständigkeit halber hinzugefügt. Versuchen Sie, ohne es auf Python 2 zu laufen, und Sie werden andere Ergebnisse erhalten als die, die ich beschrieben habe. Probieren Sie es aus.

0 Stimmen

@JasonR.Coombs Ich bin etwas verwirrt: sys.argv **is** automatically a list of strings . Meinen Sie "geben" oder "zurückgeben"?

38voto

Frédéric Hamidi Punkte 249635

sys.argv[1] enthält die erste Kommandozeile Argument an Ihr Skript übergeben.

Wenn Ihr Skript zum Beispiel den Namen hello.py und Sie geben aus:

$ python3.1 hello.py foo

oder:

$ chmod +x hello.py  # make script executable
$ ./hello.py foo

Ihr Skript wird gedruckt:

Hello there foo

0 Stimmen

Ich muss folgenden Befehl ausführen: exec py C:\\project -open \\servers\\projop\\packages\\intranet -Stundenzettel2 \\www\\hours\\y. py Gibt es eine Möglichkeit, einen relativen Pfad für die Python-Datei zu verwenden?

33voto

user2205939 Punkte 311

sys.argv ist eine Liste.

Diese Liste wird von Ihrer Befehlszeile erstellt, es ist eine Liste Ihrer Befehlszeilenargumente.

Zum Beispiel:

In der Befehlszeile geben Sie etwas wie folgt ein,

python3.2 file.py something

sys.argv wird zu einer Liste ['file.py', 'irgendwas']

In diesem Fall sys.argv[1] = 'something'

12voto

CodeWombat Punkte 778

Um die Antwort von Frederic zu ergänzen: Wenn Sie Ihr Skript zum Beispiel wie folgt aufrufen:

./myscript.py foo bar

sys.argv[0] würde "./myscript.py" lauten sys.argv[1] wäre "foo" und sys.argv[2] wäre "bar" ... und so weiter.

Wenn Sie in Ihrem Beispielcode das Skript wie folgt aufrufen ./myscript.py foo lautet die Ausgabe des Skripts "Hallo, foo".

11voto

Rahul Punkte 101

Ich füge der Antwort von Jason noch einige Punkte hinzu:

Für die Übernahme aller vom Benutzer angegebenen Argumente: user_args = sys.argv[1:]

Betrachten Sie die sys.argv als eine Liste von Zeichenketten (wie von Jason erwähnt). Daher werden alle Listenmanipulationen hier angewendet. Dies wird "List Slicing" genannt. Für weitere Informationen besuchen Sie ici .

Die Syntax sieht folgendermaßen aus: list[start:end:step] . Wenn Sie start weglassen, ist der Standardwert 0, und wenn Sie end weglassen, ist der Standardwert die Länge der Liste.

Angenommen, Sie wollen nur alle Argumente nach dem 3. Argument übernehmen:

user_args = sys.argv[3:]

Angenommen, Sie wollen nur die ersten beiden Argumente:

user_args = sys.argv[0:2]  or  user_args = sys.argv[:2]

Angenommen, Sie wollen die Argumente 2 bis 4:

user_args = sys.argv[2:4]

Nehmen wir an, Sie wollen das letzte Argument (das letzte Argument ist immer -1, also fangen wir hier mit der Zählung von hinten an. Start ist also der letzte, kein Ende, kein Schritt):

user_args = sys.argv[-1]

Angenommen, Sie wollen das vorletzte Argument:

user_args = sys.argv[-2]

Angenommen, Sie wollen die letzten beiden Argumente:

user_args = sys.argv[-2:]

Angenommen, Sie wollen die letzten beiden Argumente. Hier ist Start -2, das ist das vorletzte Element und dann das Ende (bezeichnet durch : ):

user_args = sys.argv[-2:]

Angenommen, Sie wollen alles außer den letzten beiden Argumenten. Hier ist start 0 (standardmäßig), und end ist das vorletzte Element:

user_args = sys.argv[:-2]

Angenommen, Sie wollen die Argumente in umgekehrter Reihenfolge:

user_args = sys.argv[::-1]

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