input() error - NameError: name '...' is not defined
ошибка ввода () - NameError: имя '...' не определено
Я получаю сообщение об ошибке при попытке запустить этот простой скрипт:
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, для запуска скрипта.
Переведено автоматически
Ответ 1
TL; DR
input функция в Python 2.7 вычисляет все, что вы вводите, как выражение Python. Если вы просто хотите прочитать строки, то используйте raw_input функцию в Python 2.7, которая не будет вычислять прочитанные строки.
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'isnot 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, вы захотите начать свой скрипт с:
#!/usr/bin/env python3
Если вы используете:
#!/usr/bin/env python
По умолчанию будет использоваться Python 2.x. Они отображаются в первой строке вашего скрипта, если там нет ничего, начинающегося с #! (он же shebang).
Если ваши скрипты просто начинаются с:
#! python
Затем вы можете изменить его на:
#! python3
Хотя это более короткое форматирование распознается только несколькими программами, такими как лаунчер, так что это не лучший выбор.
Первые два примера используются гораздо шире и помогут гарантировать, что ваш код будет работать на любом компьютере, на котором установлен Python.
Ответ 4
Я также столкнулся с этой проблемой с модулем, который должен был быть совместим с python 2.7 и 3.7
что я нашел для устранения проблемы, так это импорт:
from six.moves importinput
это исправило удобство использования для обоих интерпретаторов