Wie greife ich in Python auf Befehlszeilenargumente zu?


362

Ich verwende Python, um meine Projekteinstellungen einzurichten, benötige jedoch Hilfe beim Abrufen der Befehlszeilenargumente.

Ich habe das auf dem Terminal versucht:

$python myfile.py var1 var2 var3

In meiner Python-Datei möchte ich alle eingegebenen Variablen verwenden.


1
Das Baker-Modul ist ein großartiges Tool zum Schreiben von Python-Befehlszeilen-Apps. pypi.python.org/pypi/Baker/1.02
Spike Gronim

Antworten:



115
import sys

sys.argv[1:]

gibt Ihnen eine Liste von Argumenten (ohne den Namen der Python-Datei)


5
Was heißt [1:]das
Kolob Canyon

8
@KolobCanyon bedeutet "eine Unterliste von Index 1 bis zum Ende", dh das erste Element überspringen
Kamil Jarosz

@KolobCanyon nimmt das zweite Argument [1:]nach oben, da das erste Argument sys.argvstandardmäßig der Name der Python-Datei ist, die Sie beispielsweise ausführen testrun.py.
Samuel Nde

95

Ich kann nur empfehlen, argparsewas mit Python 2.7 und höher geliefert wird.

Das argparseModul reduziert den Code der Kesselplatte und macht Ihren Code robuster, da das Modul alle Standardanwendungsfälle (einschließlich Unterbefehle) behandelt, die Hilfe und Verwendung für Sie generiert, die Benutzereingaben überprüft und bereinigt - alles, worüber Sie sich Sorgen machen müssen, wenn Sie verwenden sys.argvAnsatz. Und es ist kostenlos (eingebaut).

Hier ein kleines Beispiel:

import argparse

parser = argparse.ArgumentParser("simple_example")
parser.add_argument("counter", help="An integer will be increased by 1 and printed.", type=int)
args = parser.parse_args()
print(args.counter + 1)

und die Ausgabe für python prog.py -h

usage: simple_example [-h] counter

positional arguments:
  counter     counter will be increased by 1 and printed.

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

und python prog.py 1wie zu erwarten:

2

7
Qualitätsantwort, nicht wirklich sicher, warum jemand hier einen der anderen hier angegebenen Ansätze verwenden würde. Zumal es eingebaut ist! Habt ihr nicht bessere Dinge zu tun als zu analysieren?
Bassinator

Nur um zu erwähnen, wie Sie auf das spezifische Argument im Args-Namespace zugreifen sollten: args.counter
MikeL

1
@Bassinator In Fällen, in denen keine Analyse von Argumenten erforderlich ist.
Reduzierung der Aktivität

parser.add_argument('var3', nargs='?', type=int, default=3)Um den Standardwert ohne bestimmten Wert in der Befehlszeile zu verwenden, können Sie Folgendes verwenden: var3 ist ein optionaler Parameter. Wenn Sie in der Befehlszeile keinen Wert angeben, können Sie in Ihrem Code auf var3 zugreifen, Standardwert für var3 = 3
Albicocco

56

Python-Code:

import sys

# main
param_1= sys.argv[1] 
param_2= sys.argv[2] 
param_3= sys.argv[3]  
print 'Params=', param_1, param_2, param_3

Aufruf:

$python myfile.py var1 var2 var3

Ausgabe:

Params= var1 var2 var3 

24

Sie können sys.argvdie Argumente als Liste abrufen.

Wenn Sie auf einzelne Elemente zugreifen müssen, können Sie verwenden

sys.argv[i]  

Wo iist Index, 0gibt Ihnen den Python-Dateinamen, der ausgeführt wird. Jeder Index danach sind die übergebenen Argumente.


6

Wenn Sie es so nennen: $ python myfile.py var1 var2 var3

import sys

var1 = sys.argv[1]
var2 = sys.argv[2]
var3 = sys.argv[3]

Ähnlich wie bei Arrays haben Sie auch sys.argv[0]immer das aktuelle Arbeitsverzeichnis.


6
sys.argv[0]ist nicht das aktuelle Arbeitsverzeichnis. Dies ist der Name der Datei, die ausgeführt wird.
Schauen Sie sich den

5

Einige zusätzliche Dinge, an die ich denken kann.

Wie @allsyed sagte, gibt sys.argv eine Liste der Komponenten (einschließlich des Programmnamens) an. Wenn Sie also die Anzahl der Elemente wissen möchten, die über die Befehlszeile übergeben werden, können Sie sie mit len ​​() bestimmen. Auf dieser Grundlage können Sie Ausnahme- / Fehlermeldungen entwerfen, wenn der Benutzer keine bestimmte Anzahl von Parametern übergeben hat.

Auch wenn Sie nach einer besseren Möglichkeit suchen, mit Befehlszeilenargumenten umzugehen, empfehlen wir Ihnen, sich https://docs.python.org/2/howto/argparse.html anzusehen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.