Probleme mit Eingaben mit sys.argv[1]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tobimaru
User
Beiträge: 1
Registriert: Sonntag 21. Oktober 2018, 10:42

Sonntag 21. Oktober 2018, 10:59

Hallo zusammen,
Ich lerne seit kurzem Python in der Uni und da ich bislang nur mit Java programmiert habe, ist alles noch relativ neu und ungewohnt für mich. Nun zu meiner (wahrscheinlich sehr einfachen) Frage: In der ersten Vorlesung haben wir folgenden Code behandelt:
import sys
print("Hallo",sys.argv[1])
Das Programm soll mich nach meinem Namen fragen und anschließend "Hallo <Name>" ausgeben.

Ich habe diesen Code 1 zu 1 aus der Vorlesungsfolie kopiert und in Python eingefügt, doch ich bekomme immer folgende Fehlermeldung:
IndexError: list index out of range
Was mache ich falsch? Ich habe Python vor kurzem erst installiert, möglicherweise habe ich ja dabei etwas falsch gemacht(?).

Da ich neu in diesem Forum bin, hoffe ich, dass ich hier mit meinem Anliegen richtig bin :D

Vielen Dank im Voraus! :)
__deets__
User
Beiträge: 3760
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 21. Oktober 2018, 11:35

Du musst deinen Namen als Argument beim Aufruf angeben.

python Skript.py Karl-Heinz

Das ist bei Javas public static main Methode nicht anders.
nezzcarth
User
Beiträge: 574
Registriert: Samstag 16. April 2011, 12:47

Sonntag 21. Oktober 2018, 12:00

Tobimaru hat geschrieben:
Sonntag 21. Oktober 2018, 10:59
Was mache ich falsch?
'sys.argv' ist eine Liste, die als erstes Listenelement (in Python wird von 0 an indexiert) den Namen des Scripts enthält und an den Listenpositionen 1 bis n Kommandozeilenparameter, die du (mit Leerzeichen getrennt) übergeben musst. Wenn du keine Parameter übergeben hast, gibt es auch kein Listenelement '1', auf das du zugreifen könntest. Solche Fragen kann man sich auch gut mit der Doku von Python selbst beantworten: https://docs.python.org/3/library/sys.html#sys.argv

Um die Fehlermeldung zu umgehen bzw. das Programm "geordnet" zu beenden oder Defaultwerte zu setzen, wird manchmal ein 'try .. except' -Block verwendet:

Code: Alles auswählen

try:
    name = sys.argv[1]
except IndexError:
    name = 'John Doe'
Für den ernsthaften Gebrauch bietet sich es aber meistens an, statt dieser Low-Level-Variante ein Modul wie 'argparse' aus der Standardbibliothek zu verwenden.
Benutzeravatar
__blackjack__
User
Beiträge: 1455
Registriert: Samstag 2. Juni 2018, 10:21

Montag 22. Oktober 2018, 16:45

Tobimaru: In Java entspräche das dem hier:

Code: Alles auswählen

public final class Main {

    private Main() {}

    public static void main(String... args) {
        System.out.printf("Hallo %s\n", args[0]);
    }
}
Und da bekommt man auch eine Ausname (`java.lang.ArrayIndexOutOfBoundsException`) wenn man kein Argument übergibt. Der Name des Programms ist in Java nicht in dem Argumentarray enthalten, darum bekommt man das erste Argument von der Kommandozeile dort an Index 0 und nicht an Index 1 wie in Python.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Antworten