it-roy-ru.com

ошибка input () - NameError: имя '...' не определено

Я получаю сообщение об ошибке при попытке запустить этот простой скрипт на Python:

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, для запуска скрипта.

Правка: я понял, что я как-то запускаю эти сценарии с 2.7. Думаю, реальный вопрос в том, как мне запустить мои скрипты с версией 3.3? Я подумал, что если я перетащу свои скрипты поверх приложения Python Launcher, которое находится внутри папки Python 3.3 в папке моих приложений, он запустит мои скрипты с помощью 3.3. Я предполагаю, что этот метод все еще запускает сценарии с 2.7. Итак, как мне использовать 3.3?

164
chillpenguin

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: Prompt снова.

Итак, вам лучше с функцией raw_input, как это

input_variable = raw_input("Enter your name: ")

Если вам нужно преобразовать результат в какой-либо другой тип, вы можете использовать соответствующие функции для преобразования строки, возвращаемой raw_input. Например, чтобы прочитать входные данные как целые числа, используйте функцию int, как показано в этот ответ .

В python 3.x есть только одна функция для получения пользовательского ввода, и она называется input , что эквивалентно raw_input в Python 2.7.

231
thefourtheye

Вы используете Python 2, а не Python 3. Чтобы это работало в Python 2, используйте raw_input.

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
46
user2534732

Поскольку вы пишете для Python 3.x, вы захотите начать свой сценарий с:

#!/usr/bin/env python3

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

#!/usr/bin/env python

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

Если ваши сценарии начинаются с:

#! python

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

#! python3

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

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

10
Zim

вы должны использовать raw_input, потому что вы используете python-2.7. Когда вы используете input () на примере переменной: s = input ('Name:'), он выполнит команду ON для среды Python без сохранения того, что вы написали в переменной (s) и создание ошибки. Если то, что вы написали, не определено, то вы можете использовать raw_input (), оно будет правильно сохранять то, что вы написали в переменной, например: f = raw_input ('Name:'), и не будет Выполните его в среде Python без создания возможных ошибок 

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
5
Skiller Dz

Для питона 3 и выше

s = raw_input()

это решит проблему в Pycharm IDE Если вы решаете на сайте точно хакерранк, то используйте:

s = input()
4
RAHUL KUMAR

Вы можете сделать:

x = raw_input("enter your name")
print "your name is %s " % x

или же:

x = str(input("enter your name"))
print "your name is %s" % x
2
Abdullah Baraka
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

Вы должны вводить ввод в одинарных или двойных кавычках

Ex:'dude' -> correct

    dude -> not correct
2
Parminder Singh

Для любого другого, кто может столкнуться с этой проблемой, оказывается, что даже если вы включите #!/usr/bin/env python3 в начале вашего скрипта, Shebang игнорируется, если файл не является исполняемым.

Чтобы определить, является ли ваш файл исполняемым:

  • запустить ./filename.py из командной строки
  • если вы получаете -bash: ./filename.py: Permission denied, запустите chmod a+x filename.py
  • запустите ./filename.py снова

Если вы включили import sys; print(sys.version), как предложил Кевин, вы увидите, что скрипт интерпретируется python3

2
automonous

Мы используем следующее, которое работает как Python 2 и Python 3

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
0
Hardian

Вы можете изменить Python, который вы используете со своей IDE, если вы уже загрузили Python 3.x, его не должно быть слишком сложно переключать. Но ваш скрипт отлично работает на Python 3.x, я бы просто изменил

print ("your name is" + input_variable)

в

print ("your name is", input_variable)

Потому что с запятой он печатает с пробелом между your name is и любым другим, введенным пользователем. И: если вы используете 2.7, просто используйте raw_input вместо ввода. 

0
Cleve Green

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

то, что я нашел, чтобы исправить проблему, было импортировать:

from six.moves import input

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

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

0
Elad L.

Хорошие вклады предыдущих.

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: "))
Введите ваше имя: Джо 
 («Привет», «Джо», & lttype «str»>) 
 Привет, Джо, пока 
 
 Ваше имя: Джо 
Джо

Спасибо!

0
Joe Llerena