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 Funktion raw_input in Python 2.7, die die gelesenen Zeichenketten nicht auswerten wird.

Wenn Sie Python 3.x verwenden, wurde raw_input in input umbenannt. Ich zitiere die [Python 3.0 release notes] (https://docs.python.org/3.0/whatsnew/3.0.html#builtins),

raw_input() wurde umbenannt in input(). Das heißt, die neue Funktion input() liest eine Zeile aus sys.stdin und gibt sie ohne den nachstehenden Zeilenumbruch zurück. Sie löst einen EOFError aus, wenn die Eingabe vorzeitig beendet wird. Um das alte Verhalten von input() zu erhalten, verwenden Sie eval(input())


In Python 2.7 gibt es zwei Funktionen, die benutzt werden können, um Benutzereingaben zu akzeptieren. Eine ist input und die andere ist raw_input. Man kann sich die Beziehung zwischen ihnen wie folgt vorstellen

input = eval(raw_input)

Betrachten Sie den folgenden Code, um dies besser zu verstehen

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

input nimmt eine Zeichenkette vom Benutzer entgegen und wertet die Zeichenkette im aktuellen Python-Kontext aus. Wenn ich dude als Eingabe eintippe, stellt es fest, dass dude an den Wert thefourtheye gebunden ist und so wird das Ergebnis der Auswertung zu thefourtheye und das wird der input_variable zugewiesen.

Wenn ich etwas anderes eingebe, das im aktuellen Python-Kontext nicht vorhanden ist, wird es mit dem NameError fehlschlagen.

>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
  File "<input>", line 1, in 
  File "", line 1, in 
NameError: name 'dummy' is not defined

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 mit import os geladen haben, und der Benutzer tippt dann in

os.remove("/etc/hosts")

ein, 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.

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude

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 so

input_variable = raw_input("Enter your name: ")

Wenn 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 Funktion int, 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's raw_input entspricht.

Kommentare (0)

Sie verwenden Python 2, nicht Python 3. Damit dies in Python 2 funktioniert, verwenden Sie raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Kommentare (0)

Da Sie für Python 3.x schreiben, sollten Sie Ihr Skript mit beginnen:

#!/usr/bin/env python3

Wenn Sie verwenden:

#!/usr/bin/env python

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:

#! python

Dann können Sie es ändern in:

#! python3

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.

Kommentare (0)