input() error - NameError: Name '...' ist nicht definiert
Ich erhalte einen Fehler, wenn ich versuche, dieses einfache Python-Skript auszuführen:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Sagen wir, ich gebe "dude" ein, dann erhalte ich folgende Fehlermeldung:
line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
Ich verwende Mac OS X 10.9.1 und benutze die Python Launcher App, die mit der Installation von Python 3.3 geliefert wurde, um das Skript auszuführen.
Edit: Ich habe festgestellt, dass ich diese Skripte irgendwie mit 2.7 ausführe. Ich schätze, die eigentliche Frage ist, wie ich meine Skripte mit Version 3.3 ausführe. Ich dachte, wenn ich meine Skripte auf die Python Launcher-App ziehe, die sich im Python 3.3-Ordner in meinem Anwendungsordner befindet, würde sie meine Skripte mit 3.3 starten. Ich vermute, dass diese Methode immer noch Skripte mit 2.7 startet. Wie kann ich also 3.3 verwenden?
TL;DR
Die Funktion
input
in Python 2.7 wertet alles, was Sie eingeben, als Python-Ausdruck aus. Wenn Sie einfach nur Zeichenketten lesen wollen, dann verwenden Sie die Funktionraw_input
in Python 2.7, die die gelesenen Zeichenketten nicht auswerten wird.Wenn Sie Python 3.x verwenden, wurde
raw_input
ininput
umbenannt. Ich zitiere die [Python 3.0 release notes] (https://docs.python.org/3.0/whatsnew/3.0.html#builtins),In Python 2.7 gibt es zwei Funktionen, die benutzt werden können, um Benutzereingaben zu akzeptieren. Eine ist
input
und die andere istraw_input
. Man kann sich die Beziehung zwischen ihnen wie folgt vorstellenBetrachten Sie den folgenden Code, um dies besser zu verstehen
input
nimmt eine Zeichenkette vom Benutzer entgegen und wertet die Zeichenkette im aktuellen Python-Kontext aus. Wenn ichdude
als Eingabe eintippe, stellt es fest, dassdude
an den Wertthefourtheye
gebunden ist und so wird das Ergebnis der Auswertung zuthefourtheye
und das wird derinput_variable
zugewiesen.Wenn ich etwas anderes eingebe, das im aktuellen Python-Kontext nicht vorhanden ist, wird es mit dem
NameError
fehlschlagen.Sicherheitsüberlegungen mit Python 2.7's
input
:Da alles, was der Benutzer eingibt, ausgewertet wird, ergeben sich daraus auch Sicherheitsfragen. Wenn Sie zum Beispiel das Modul
os
in Ihrem Programm mitimport os
geladen haben, und der Benutzer tippt dann inein, wird dies von Python als Funktionsaufruf ausgewertet und ausgeführt. Wenn Sie Python mit erhöhten Rechten ausführen, wird die Datei
/etc/hosts
gelöscht. Sehen Sie, wie gefährlich das sein kann?Um dies zu demonstrieren, lassen Sie uns erneut versuchen, die Funktion
input
auszuführen.Wenn nun
input("Geben Sie Ihren Namen ein: ")
ausgeführt wird, wartet es auf die Benutzereingabe und die Benutzereingabe ist ein gültiger Python-Funktionsaufruf und wird daher auch aufgerufen. Deshalb sehen wir die Aufforderung "Geben Sie Ihren Namen erneut ein:".Es ist also besser, wenn Sie die Funktion
raw_input
verwenden, etwa soWenn Sie das Ergebnis in einen anderen Typ konvertieren müssen, können Sie geeignete Funktionen verwenden, um die von der Funktion
raw_input
zurückgegebene Zeichenkette zu konvertieren. Um zum Beispiel Eingaben als Ganzzahlen zu lesen, verwenden Sie die Funktionint
, wie in dieser Antwort gezeigt.In Python 3.x gibt es nur eine Funktion, um Benutzereingaben zu erhalten, und die heißt
input
, was Python 2.7'sraw_input
entspricht.Sie verwenden Python 2, nicht Python 3. Damit dies in Python 2 funktioniert, verwenden Sie
raw_input
.Da Sie für Python 3.x schreiben, sollten Sie Ihr Skript mit beginnen:
Wenn Sie verwenden:
Es wird standardmäßig Python 2.x verwendet. Diese stehen in der ersten Zeile Ihres Skripts, wenn nichts mit #! beginnt (auch bekannt als Shebang).
Wenn Ihre Skripte nur mit beginnen:
Dann können Sie es ändern in:
Diese kürzere Formatierung wird allerdings nur von einigen wenigen Programmen, wie dem Launcher, erkannt und ist daher nicht die beste Wahl.
Die ersten beiden Beispiele sind viel verbreiteter und stellen sicher, dass Ihr Code auf jedem Rechner funktioniert, auf dem Python installiert ist.