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.
python
python-2.7
input
nameerror
chillpenguin
quelle
quelle
input
, dass ich mich so verhalte, aber nur in 2.7. Was sagt es aus, wenn Siepython --version
an einer Eingabeaufforderung ausgeführt werden? Was ist alternativ, wenn Sieimport sys; print(sys.version)
am Anfang Ihres Skripts schreiben ?import sys
und als zweite Zeileprint(sys.version_info)
ein, um festzustellen, welche Version Sie verwenden.Antworten:
TL; DR
input
Die Funktion in Python 2.7 wertet Ihre Eingabe als Python-Ausdruck aus. Wenn Sie nur Zeichenfolgen lesen möchten, verwenden Sie dieraw_input
Funktion in Python 2.7, mit der die gelesenen Zeichenfolgen nicht ausgewertet werden.Wenn Sie Python 3.x verwenden,
raw_input
wurde in umbenanntinput
. Zitieren der Python 3.0- Versionshinweise ,In Python 2.7 gibt es zwei Funktionen, mit denen Benutzereingaben akzeptiert werden können. Einer ist
input
und der andere istraw_input
. Sie können sich die Beziehung zwischen ihnen wie folgt vorstellenBetrachten Sie den folgenden Code, um dies besser zu verstehen
input
Akzeptiert eine Zeichenfolge vom Benutzer und wertet die Zeichenfolge im aktuellen Python-Kontext aus. Wenn ichdude
als Eingabe eingebe, wird festgestellt, dass diesdude
an den Wert gebunden istthefourtheye
und das Ergebnis der Auswertung wirdthefourtheye
und dem zugewiesen wirdinput_variable
.Wenn ich etwas anderes eingebe, das im aktuellen Python-Kontext nicht vorhanden ist, schlägt dies fehl
NameError
.Sicherheitsüberlegungen zu Python 2.7
input
:Da alle Benutzertypen ausgewertet werden, entstehen auch Sicherheitsprobleme. Zum Beispiel, wenn Sie bereits ein
os
Modul in Ihr Programm geladen habenimport os
und der Benutzer dann eingibtDies 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
input
erneut , die Funktion auszuführen .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 wirEnter your name again:
wieder prompt.Mit dieser
raw_input
Funktion sind Sie also besser dranWenn 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 dieint
in 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
input
wird und Python 2.7 entsprichtraw_input
.quelle
Sie führen Python 2 und nicht Python 3 aus. Damit dies in Python 2 funktioniert, verwenden Sie
raw_input
.quelle
Da Sie für Python 3.x schreiben, sollten Sie Ihr Skript beginnen mit:
Wenn du benutzt:
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:
Dann können Sie es ändern in:
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.
quelle
Sie sollten verwenden,
raw_input
weil Sie Python-2.7 verwenden. Wenn Sieinput()
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:quelle
Für Python 3 und höher
es wird das Problem auf pycharm IDE lösen, wenn Sie auf der Online-Site genau Hackerrank lösen, dann verwenden Sie:
quelle
Sie könnten entweder tun:
oder:
quelle
Sie müssen die Eingabe entweder in einfache oder doppelte Anführungszeichen eingeben
quelle
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:
Dies stellte die Benutzerfreundlichkeit für beide Dolmetscher fest
Sie können mehr über die sechs Bibliothek lesen hier
quelle
Wir verwenden Folgendes, das sowohl für Python 2 als auch für Python 3 funktioniert
quelle
Für alle anderen, die möglicherweise auf dieses Problem stoßen, stellt sich heraus, dass
#!/usr/bin/env python3
der 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:
./filename.py
die Befehlszeile aus-bash: ./filename.py: Permission denied
, laufen Siechmod a+x filename.py
./filename.py
wieder laufenWenn Sie
import sys; print(sys.version)
wie von Kevin vorgeschlagen aufgenommen haben, sehen Sie jetzt, dass das Skript von python3 interpretiert wirdquelle
Gute Beiträge die vorherigen.
Vielen Dank!
quelle
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
string
beginnen Sie einfach mit "Eingabe geht in doppelte Anführungszeichen" und es funktioniert in Python2.7 undDer zweite Weg ist, bei Codeänderungen
den folgenden Import zu verwenden und mit einer beliebigen Version von Python auszuführen
from six.moves import input
raw_input()
Funktion anstelle derinput()
Funktion in Ihrem Codestr()
Funktion likestr(input())
und weisen Sie ihn dann einer beliebigen Variablen zuWie 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.
quelle
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
zu
Denn mit dem Komma wird mit einem Leerzeichen dazwischen
your name is
und was auch immer der Benutzer eingegeben hat, gedruckt. UND: Wenn Sie 2.7 verwenden,raw_input
verwenden Sie einfach anstelle der Eingabe.quelle