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

219

Ich erhalte eine Fehlermeldung, wenn ich versuche, dieses einfache Skript auszuführen:

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Angenommen, ich tippe "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 führe diese Skripte mit Python 2.7 aus.

chillpenguin
quelle
12
Sind Sie sicher, dass es Python 3.3 ist? Ich würde erwarten input, dass ich mich so verhalte, aber nur in 2.7. Was sagt es aus, wenn Sie python --versionan einer Eingabeaufforderung ausgeführt werden? Was ist alternativ, wenn Sie import sys; print(sys.version)am Anfang Ihres Skripts schreiben ?
Kevin
1
Sie führen Python 3 nicht aus. Sie führen Python 2 aus (ich bin mit dieser "Python Launcher" -App nicht vertraut)
Wooble
1
Geben Sie als erste import sysund als zweite Zeile print(sys.version_info)ein, um festzustellen, welche Version Sie verwenden.
Hyperboreus
1
Ich habe getan, was Kevin gesagt hat und es ist Version 2.7.5! Ich bin mir aber nicht sicher wie. Ich habe Version 3.3 heruntergeladen und installiert. In meinem Anwendungsordner befindet sich ein Ordner mit dem Namen "Python 3.3". In diesem Ordner befindet sich eine App mit dem Namen "Python Launcher". Ich führe meine Skripte aus, indem ich sie auf die Python Launcher-App ziehe und dort ablege . Wie kommt es, dass ich immer noch 2.7 verwende, wenn ich die 3.3 Launcher-App verwende?
Chillpenguin
2
@chillpenguin: Überprüfen Sie das Dialogfeld "Einstellungen" für Python Launcher. Anscheinend wird nicht standardmäßig die Version ausgeführt, mit der es installiert wurde, was ... dumm ist. (Ich habe es selbst nie benutzt; ich finde es besser, das Terminal zu benutzen ...)
Wooble

Antworten:

265

TL; DR

inputDie Funktion in Python 2.7 wertet Ihre Eingabe als Python-Ausdruck aus. Wenn Sie nur Zeichenfolgen lesen möchten, verwenden Sie die raw_inputFunktion in Python 2.7, mit der die gelesenen Zeichenfolgen nicht ausgewertet werden.

Wenn Sie Python 3.x verwenden, raw_inputwurde in umbenannt input. Zitieren der Python 3.0- Versionshinweise ,

raw_input()wurde umbenannt in input(). Das heißt, die neue input()Funktion liest eine Zeile aus sys.stdinund gibt sie zurück, wobei die nachfolgende neue Zeile entfernt wird. Es wird ausgelöst, EOFErrorwenn die Eingabe vorzeitig beendet wird. input()Verwenden Sie, um das alte Verhalten von zu erhalteneval(input())


In Python 2.7 gibt es zwei Funktionen, mit denen Benutzereingaben akzeptiert werden können. Einer ist inputund 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'

inputAkzeptiert eine Zeichenfolge vom Benutzer und wertet die Zeichenfolge im aktuellen Python-Kontext aus. Wenn ich dudeals Eingabe eingebe, wird festgestellt, dass dies dudean den Wert gebunden ist thefourtheyeund das Ergebnis der Auswertung wird thefourtheyeund dem zugewiesen wird input_variable.

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

>>> 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 zu Python 2.7 input:

Da alle Benutzertypen ausgewertet werden, entstehen auch Sicherheitsprobleme. Zum Beispiel, wenn Sie bereits ein osModul in Ihr Programm geladen haben import osund der Benutzer dann eingibt

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/hostsDatei gelöscht. Sehen Sie, wie gefährlich es sein könnte?

Um dies zu demonstrieren, versuchen wir inputerneut , die Funktion auszuführen .

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

Wenn input("Enter your name: ")es jetzt 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 Enter your name again:wieder prompt.

Mit dieser raw_inputFunktion sind Sie also besser dran

input_variable = raw_input("Enter your name: ")

Wenn Sie das Ergebnis in einen anderen Typ konvertieren müssen, können Sie die von zurückgegebene Zeichenfolge mithilfe geeigneter Funktionen konvertieren raw_input. Verwenden Sie beispielsweise die intin dieser Antwort gezeigte Funktion, um Eingaben als Ganzzahlen zu lesen .

In Python 3.x gibt es nur eine Funktion zum Abrufen von Benutzereingaben, die aufgerufen inputwird und Python 2.7 entspricht raw_input.

thefourtheye
quelle
56

Sie führen Python 2 und nicht Python 3 aus. Damit dies in Python 2 funktioniert, verwenden Sie raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Davidismus
quelle
17

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

#!/usr/bin/env python3

Wenn du benutzt:

#!/usr/bin/env python

Es wird standardmäßig Python 2.x verwendet. Diese gehen in die erste Zeile Ihres Skripts, wenn nichts mit # beginnt ! (auch bekannt als der Schebang).

Wenn Ihre Skripte einfach beginnen 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 stellen sicher, dass Ihr Code auf jedem Computer funktioniert, auf dem Python installiert ist.

Zim
quelle
6

Sie sollten verwenden, raw_inputweil Sie Python-2.7 verwenden. Wenn Sie input()eine Variable verwenden (zum Beispiel :) s = input('Name: '), führt sie den Befehl ON in der Python-Umgebung aus, ohne zu speichern, was Sie in die Variable ( s) geschrieben haben, und erstellt einen Fehler, wenn das, was Sie geschrieben haben, nicht definiert ist.

raw_input()speichert korrekt, was Sie in die Variable geschrieben haben (zum Beispiel :) f = raw_input('Name : '), und führt sie nicht in der Python-Umgebung aus, ohne einen möglichen Fehler zu verursachen:

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

Für Python 3 und höher

s = raw_input()

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

s = input()
RAHUL KUMAR
quelle
4

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
Abdullah Baraka
quelle
1
raw_input hat das Problem für mich behoben
Spencer Goff
Aber raw_input () ist nicht in Python 3 verfügbar.
carthurs
4
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Sie müssen die Eingabe entweder in einfache oder doppelte Anführungszeichen eingeben

Ex:'dude' -> correct

    dude -> not correct
Parminder Singh
quelle
4

Ich bin auch auf dieses Problem mit einem Modul gestoßen, das für 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

Dies stellte die Benutzerfreundlichkeit für beide Dolmetscher fest

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

Elad L.
quelle
3

Wir verwenden Folgendes, das sowohl für Python 2 als auch für Python 3 funktioniert

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

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

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

  • Führen Sie ./filename.pydie Befehlszeile aus
  • Wenn Sie bekommen -bash: ./filename.py: Permission denied, laufen Siechmod a+x filename.py
  • ./filename.pywieder laufen

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

automatisch
quelle
2

Gute Beiträge die vorherigen.

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', <Typ 'str'>)
Hallo Joe, tschüss 

Dein Name: Joe
Joe

Vielen Dank!

Joe Llerena
quelle
1

Es gibt zwei Möglichkeiten, um diese Probleme zu beheben:

  • 1st ist einfach ohne Codeänderung,
    die Ihr Skript von Python3 ausführt.
    Wenn Sie weiterhin auf Python2 ausführen möchten, denken Sie bei der Eingabe der Eingabe daran, nachdem Sie Ihr Python-Skript ausgeführt haben

    1. Wenn Sie eingeben möchten, stringbeginnen Sie einfach mit "Eingabe geht in doppelte Anführungszeichen" und es funktioniert in Python2.7 und
    2. Wenn Sie ein Zeichen eingeben möchten, verwenden Sie die Eingabe mit einem einfachen Anführungszeichen wie "Ihre Eingabe geht hier".
    3. Wenn Sie eine Nummer eingeben möchten, die kein Problem darstellt, geben Sie einfach die Nummer ein
  • Der zweite Weg ist, bei Codeänderungen
    den folgenden Import zu verwenden und mit einer beliebigen Version von Python auszuführen

    1. from six.moves import input
    2. Verwenden Sie bei jedem Import die raw_input()Funktion anstelle der input()Funktion in Ihrem Code
    3. Bereinigen Sie Ihren Code mit der str()Funktion like str(input())und weisen Sie ihn dann einer beliebigen Variablen zu

Wie der Fehler impliziert : Der
Name 'Dude' ist nicht definiert, dh für Python wird 'Dude' hier variabel und es wird kein Wert des Python-definierten Typs zugewiesen,
sodass nur das Weinen wie Baby angezeigt wird. Wenn wir also eine 'Dude'-Variable definieren und einen beliebigen Wert zuweisen und weitergeben, es wird funktionieren, aber das ist nicht das, was wir wollen, da wir nicht wissen, was der Benutzer eingeben wird, und außerdem wollen wir die Benutzereingaben erfassen.

Fakten zu dieser Methode:
input() Funktion: Diese Funktion übernimmt den Wert und den Typ der eingegebenen Eingabe unverändert, ohne den Typ zu ändern.
raw_input() Funktion: Diese Funktion konvertiert die von Ihnen eingegebene Eingabe explizit in eine Typzeichenfolge.

Hinweis:
Die Sicherheitsanfälligkeit in der Methode input () liegt in der Tatsache, dass auf die Variable, die auf den Wert der Eingabe zugreift, jeder zugreifen kann, indem er nur den Namen der Variablen oder Methode verwendet.

Marine Kishor Jha
quelle
0

Sie können ändern, welche Python Sie mit Ihrer IDE verwenden. Wenn Sie Python 3.x bereits heruntergeladen haben, sollte es nicht zu schwierig sein, zu wechseln. Aber dein Skript funktioniert gut unter Python 3.x, ich würde es nur ändern

print ("your name is" + input_variable)

zu

print ("your name is", input_variable)

Denn mit dem Komma wird mit einem Leerzeichen dazwischen your name isund was auch immer der Benutzer eingegeben hat, gedruckt. UND: Wenn Sie 2.7 verwenden, raw_inputverwenden Sie einfach anstelle der Eingabe.

Cleve Green
quelle