it-swarm.com.de

input () error - NameError: Name '...' ist nicht definiert

Ich erhalte eine Fehlermeldung, 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. Der Fehler, den ich erhalte, ist:

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 verwende die Python Launcher-App, die mit der Installation von Python 3.3 geliefert wurde, um das Skript auszuführen.

Edit: Mir wurde klar, dass ich diese Skripte irgendwie mit 2.7 laufen lasse. Ich denke, die eigentliche Frage ist, wie ich meine Skripte mit Version 3.3 ausführen kann. Ich dachte, wenn ich meine Skripte auf die Python Launcher-App im Ordner Python 3.3 in meinem Anwendungsordner gezogen habe, würde sie meine Skripts mit 3.3 starten. Ich vermute, diese Methode startet immer noch Skripte mit 2.7. Wie verwende ich 3.3?

164
chillpenguin

TL; DR

Die input-Funktion in Python 2.7 wertet Ihre Eingaben als Python-Ausdruck aus. Wenn Sie nur Strings lesen möchten, verwenden Sie in Python 2.7 die Funktion raw_input, die die gelesenen Strings nicht auswertet.

Wenn Sie Python 3.x verwenden, wurde raw_input in input umbenannt. Zitieren der Python 3.0 Versionshinweise ,

raw_input() wurde in input() umbenannt. Das heißt, die neue input()-Funktion liest eine Zeile aus sys.stdin und gibt sie mit abgehender Zeile zurück. EOFError wird ausgelöst, 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, mit denen Benutzereingaben akzeptiert werden können. Einer ist input und der andere ist raw_input . Sie können 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 akzeptiert einen String vom Benutzer und wertet den String im aktuellen Python-Kontext aus. Wenn ich dude als Eingabe eingebe, wird festgestellt, dass dude an den Wert thefourtheye gebunden ist. Das Ergebnis der Auswertung wird also zu thefourtheye und wird input_variable zugewiesen.

Wenn ich etwas anderes eingebe, das im aktuellen Python-Kontext nicht vorhanden ist, schlägt die NameError fehl.

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

Sicherheitsüberlegungen mit Python 2.7 input:

Da alle Benutzertypen ausgewertet werden, sind auch Sicherheitsprobleme erforderlich. Wenn Sie beispielsweise os-Modul mit import os in Ihr Programm geladen haben, tippen Sie den Benutzer ein

os.remove("/etc/hosts")

dies wird von Python als Funktionsaufrufausdruck ausgewertet und ausgeführt. Wenn Sie Python mit erhöhten Berechtigungen ausführen, wird die /etc/hosts-Datei gelöscht. Sehen Sie, wie gefährlich es sein könnte.

Um dies zu demonstrieren, versuchen wir erneut, 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("Enter your name: ") ausgeführt wird, wartet es auf die Benutzereingabe und die Benutzereingabe ist ein gültiger Aufruf der Python-Funktion und wird daher auch aufgerufen. Deshalb sehen wir wieder Enter your name again: Prompt.

Mit der raw_input-Funktion sind Sie also besser aufgehoben

input_variable = raw_input("Enter your name: ")

Wenn Sie das Ergebnis in einen anderen Typ konvertieren müssen, können Sie die von raw_input zurückgegebene Zeichenfolge mit entsprechenden Funktionen konvertieren. Um beispielsweise Eingaben als Ganzzahlen zu lesen, verwenden Sie die Funktion int, wie in diese Antwort gezeigt.

In python 3.x gibt es nur eine Funktion zum Abrufen von Benutzereingaben, die als input bezeichnet wird, was dem raw_input von Python 2.7 entspricht.

231
thefourtheye

Sie verwenden Python 2, nicht Python 3. Verwenden Sie raw_input, um dies in Python 2 zu verwenden.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
46
user2534732

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

#!/usr/bin/env python3

Wenn du benutzt:

#!/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).

Beginnen Sie Ihre Skripte mit:

#! python

Dann können Sie es ändern in:

#! python3

Obwohl diese kürzere Formatierung nur von wenigen Programmen wie dem Launcher erkannt wird, ist sie nicht die beste Wahl. 

Die ersten beiden Beispiele werden viel häufiger verwendet und sorgen dafür, dass Ihr Code auf jedem Computer funktioniert, auf dem Python installiert ist.

10
Zim

sie sollten raw_input verwenden, da Sie python-2.7 verwenden. Wenn Sie input () für ein Variablenbeispiel verwenden: s = input ('Name:') führt den Befehl auf der Python-Umgebung aus, ohne zu speichern, was Sie für die Variable geschrieben haben (s) und Erstellen eines Fehlers Wenn Sie das, was Sie geschrieben haben, nicht definiert hat, können Sie raw_input () verwenden. Dies speichert das, was Sie über die Variable geschrieben haben. Beispiel: f = raw_input ('Name:') und nicht Führen Sie es in der Python-Umgebung aus, ohne mögliche Fehler zu erstellen 

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
5
Skiller Dz

Für Python 3 und höher

s = raw_input()

es wird das Problem auf der pycharm IDE. lösen. Wenn Sie auf der Online-Site genau hackerrank lösen, dann verwenden Sie:

s = input()
4
RAHUL KUMAR

Sie könnten entweder tun:

x = raw_input("enter your name")
print "your name is %s " % x

oder:

x = str(input("enter your name"))
print "your name is %s" % x
2
Abdullah Baraka
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Sie müssen entweder einfache oder doppelte Anführungszeichen eingeben

Ex:'dude' -> correct

    dude -> not correct
2
Parminder Singh

Für alle anderen Personen, die möglicherweise auf dieses Problem stoßen, stellt sich heraus, dass Shebang ignoriert wird, auch wenn Sie #!/usr/bin/env python3 am Anfang Ihres Skripts enthalten, wenn die Datei nicht ausführbar ist.

So stellen Sie fest, ob Ihre Datei ausführbar ist oder nicht:

  • führen Sie ./filename.py von der Befehlszeile aus
  • wenn Sie -bash: ./filename.py: Permission denied erhalten, führen Sie chmod a+x filename.py aus.
  • führen Sie ./filename.py erneut aus

Wenn Sie import sys; print(sys.version) als Kevin vorgeschlagen haben, sehen Sie jetzt, dass das Skript von python3 interpretiert wird

2
automonous

Wir verwenden das Folgende, das sowohl Python 2 als auch Python 3 funktioniert.

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
0
Hardian

Sie können den Python, den Sie mit Ihrer IDE verwenden, ändern. Wenn Sie Python 3.x bereits heruntergeladen haben, sollte das Wechseln nicht zu schwierig sein. Aber Ihr Skript funktioniert gut mit Python 3.x, ich würde es einfach ändern

print ("your name is" + input_variable)

zu

print ("your name is", input_variable)

Denn mit dem Komma wird mit einem Leerzeichen zwischen your name is und dem, was der Benutzer eingibt, gedruckt. UND: Wenn Sie 2.7 verwenden, verwenden Sie einfach raw_input anstelle der Eingabe. 

0
Cleve Green

Dieses Problem trat auch bei einem Modul auf, das mit Python 2.7 und 3.7 kompatibel sein sollte

was ich gefunden habe, um das Problem zu beheben, war der Import:

from six.moves import input

damit wurde die Benutzerfreundlichkeit für beide Dolmetscher festgelegt

sie können mehr über die sechs Bibliothek lesen hier

0
Elad L.

Gute Beiträge der Vorgänger.

import sys; print(sys.version)

def ingreso(nombre):
    print('Hi ', nombre, type(nombre))

def bienvenida(nombre):
    print("Hi "+nombre+", bye ")

nombre = raw_input("Enter your name: ")

ingreso(nombre)
bienvenida(nombre)

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Your name: "))
Geben Sie Ihren Namen ein: Joe 
 ('Hi', 'Joe', & lttype 'str'>) 
 Hallo Joe, Tschüss 
 
 Ihr Name: Joe 
 Joe 

Vielen Dank!

0
Joe Llerena