Вопрос-Ответ

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, которая не будет вычислять прочитанные строки.

Если вы используете 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, вы захотите начать свой скрипт с:

#!/usr/bin/env python3

Если вы используете:

#!/usr/bin/env python

По умолчанию будет использоваться Python 2.x. Они отображаются в первой строке вашего скрипта, если там нет ничего, начинающегося с #! (он же shebang).

Если ваши скрипты просто начинаются с:

#! python

Затем вы можете изменить его на:

#! python3

Хотя это более короткое форматирование распознается только несколькими программами, такими как лаунчер, так что это не лучший выбор.

Первые два примера используются гораздо шире и помогут гарантировать, что ваш код будет работать на любом компьютере, на котором установлен Python.

Ответ 4

Я также столкнулся с этой проблемой с модулем, который должен был быть совместим с python 2.7 и 3.7

что я нашел для устранения проблемы, так это импорт:

from six.moves import input

это исправило удобство использования для обоих интерпретаторов

вы можете прочитать больше о библиотеке six здесь

python python-2.7