Ошибка ввода() - 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', &lttype 'str'&gt)
Hi Joe, bye 

Your name: Joe
Joe

Спасибо!