Ошибка ввода() - NameError: имя "..." не определено
Я получаю сообщение об ошибке, когда пытаюсь запустить этот простой python script:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Скажем, я набираю "чувак", ошибка, которую я получаю, это:
line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
Я запускаю Mac OS X 10.9.1, и я использую приложение Python Launcher, которое поставляется с установкой python 3.3 для запуска script.
Изменить: я понял, что я как-то запускаю эти скрипты с помощью 2.7. Я предполагаю, что реальный вопрос заключается в том, как запустить мои скрипты с версией 3.3? Я подумал, что если я перетащил свои сценарии поверх приложения Python Launcher, находящегося внутри папки Python 3.3 в папке моих приложений, чтобы запустить мои скрипты с помощью 3.3. Я предполагаю, что этот метод все еще запускает скрипты с 2.7. Итак, как использовать 3.3?
Ответы
Ответ 1
TL; DR
input
функция в Python 2.7, оценивает все, что вы вводите, как выражение Python. Если вы просто хотите прочитать строки, используйте функцию raw_input
в Python 2.7, которая не будет оценивать прочитанные строки.
Если вы используете Python 3.x, raw_input
был переименован в input
. Цитирование примечания к выпуску Python 3.0,
raw_input()
было переименовано в input()
. То есть, новая функция input()
считывает строку из sys.stdin
и возвращает ее с завершающей новой линией. Он поднимает EOFError
, если вход завершается преждевременно. Чтобы получить старое поведение input()
, используйте eval(input())
В Python 2.7 существуют две функции, которые могут использоваться для приема пользовательских входов. Один из них - input
, а другой raw_input
. Вы можете думать о связи между ними следующим образом
input = eval(raw_input)
Рассмотрим следующий фрагмент кода, чтобы лучше понять это
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
принимает строку от пользователя и оценивает строку в текущем контексте Python. Когда я ввожу dude
в качестве ввода, он обнаруживает, что dude
привязан к значению thefourtheye
, и поэтому результат оценки становится thefourtheye
и присваивается input_variable
.
Если я введу что-то другое, чего нет в текущем контексте python, он будет терпеть неудачу, если будет 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
Вопросы безопасности с Python 2.7 input
:
Поскольку все типы пользователей оцениваются, это также создает проблемы безопасности. Например, если вы уже загрузили модуль os
в свою программу с помощью import os
, а затем пользователь вводит
os.remove("/etc/hosts")
это будет оцениваться как выражение вызова функции python, и оно будет выполнено. Если вы выполняете Python с повышенными привилегиями, файл /etc/hosts
будет удален. Смотрите, насколько опасно это быть?
Чтобы продемонстрировать это, попробуйте снова выполнить функцию input
.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Теперь, когда input("Enter your name: ")
выполняется, он ожидает ввода пользователя, а пользовательский ввод является действительным вызовом функции Python и поэтому также вызывается. Вот почему мы снова видим приглашение Enter your name again:
.
Итак, вам лучше работать с функцией raw_input
, например
input_variable = raw_input("Enter your name: ")
Если вам нужно преобразовать результат в какой-либо другой тип, то вы можете использовать соответствующие функции для преобразования строки, возвращаемой raw_input
. Например, чтобы читать входы как целые числа, используйте функцию int
, как показано в этом ответе.
В python 3.x существует только одна функция для получения пользовательских входов и которая называется input
, что эквивалентно Python 2.7 raw_input
.
Ответ 2
Вы используете Python 2, а не Python 3. Для этого в Python 2 используйте raw_input
.
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Ответ 3
Поскольку вы пишете для Python 3.x, вы должны начать свой script с помощью
#!/usr/bin/env python3
Если вы используете:
#!/usr/bin/env python
По умолчанию Python 2.x. Они идут в первую строку вашего script, если ничего не начинается С#! (иначе это shebang).
Если ваши скрипты начинаются с:
#! python
Затем вы можете изменить его на:
#! python3
Хотя это более короткое форматирование распознается только несколькими программами, такими как пусковая установка, поэтому это не лучший выбор.
Первые два примера гораздо более широко используются и помогут гарантировать, что ваш код будет работать на любой машине, на которой установлен Python.
Ответ 4
Вы должны использовать raw_input
потому что вы используете python-2.7. При использовании input()
на переменном (например: s = input('Name: ')
), он будет выполнять команду на окружающую среду Python без сохранения того, что вы написали на переменном (s
) и создать ошибку, если какой ты написал не определено.
raw_input()
правильно сохранит то, что вы написали в переменной (например: f = raw_input('Name: ')
), и не выполнит его в среде Python без создания возможной ошибки:
input_variable = raw_input('Enter Your Name : ')
print("Your Name Is : " + (input_variable))
Ответ 5
Для питона 3 и выше
s = raw_input()
это решит проблему в Pycharm IDE, если вы решаете на сайте точно хакерранк, то используйте:
s = input()
Ответ 6
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Вы должны вводить ввод в одинарных или двойных кавычках
Ex:'dude' -> correct
dude -> not correct
Ответ 7
Для всех, кто может столкнуться с этой проблемой, выясняется, что даже если вы включаете #!/usr/bin/env python3
в начало вашего script, shebang игнорируется, если файл не является исполняемым.
Чтобы определить, выполним ли ваш файл:
- запустите
./filename.py
из командной строки
- если вы получите
-bash: ./filename.py: Permission denied
, запустите chmod a+x filename.py
- снова запустите
./filename.py
Если вы включили import sys; print(sys.version)
, как предложил Кевин, теперь вы увидите, что script интерпретируется python3
Ответ 8
Вы можете сделать:
x = raw_input("enter your name")
print "your name is %s " % x
или же:
x = str(input("enter your name"))
print "your name is %s" % x
Ответ 9
Мы используем следующее, которое работает как Python 2 и Python 3
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
Ответ 10
Я также столкнулся с этой проблемой с модулем, который должен был быть совместимым для Python 2.7 и 3.7
то, что я нашел, чтобы исправить проблему, было импортировать:
from six.moves import input
это исправило удобство использования для обоих переводчиков
Вы можете прочитать больше о шести библиотеках здесь
Ответ 11
Вы можете изменить, какой питон вы используете с вашей IDE, если вы уже загрузили python 3.x, его не следует слишком сложно переключать. Но ваш script отлично работает на python 3.x, я просто изменил бы
print ("your name is" + input_variable)
к
print ("your name is", input_variable)
Потому что с запятой он печатает с пробелом между your name is
и тем, что вводит пользователь. И: если вы используете 2.7, просто используйте raw_input
вместо ввода.
Ответ 12
Хорошие вклады предыдущих.
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: "))
Enter your name: Joe
('Hi ', 'Joe', <type 'str'>)
Hi Joe, bye
Your name: Joe
Joe
Спасибо!