ошибка input () - 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

Я запускаю эти скрипты с Python 2.7.


person chillpenguin    schedule 14.01.2014    source источник
comment
Вы уверены, что это Python 3.3? Я ожидал, что input будет вести себя так, но только в версии 2.7. Что он говорит, когда вы запускаете python --version из командной строки? В качестве альтернативы, что, если вы напишете import sys; print(sys.version) в начале вашего скрипта?   -  person Kevin    schedule 14.01.2014
comment
Вы не используете Python 3. Почему-то вы используете Python 2 (я не знаком с этим приложением Python Launcher)   -  person Wooble    schedule 14.01.2014
comment
Поместите в качестве первой строки import sys и второй строки print(sys.version_info), чтобы определить, какую версию вы используете.   -  person Hyperboreus    schedule 14.01.2014
comment
Я сделал то, что сказал Кевин, и это версия 2.7.5! Я не знаю, как это сделать. Я загрузил и установил версию 3.3, в папке моих приложений есть папка с названием Python 3.3, внутри этой папки есть приложение под названием Python Launcher, и я запускаю свои скрипты, перетаскивая их в приложение Python Launcher. Почему я все еще использую 2.7, когда использую приложение запуска 3.3?   -  person chillpenguin    schedule 14.01.2014
comment
@chillpenguin Пожалуйста, укажите в вопросе, что вы используете 2.7. Очень важно ответить на этот вопрос.   -  person thefourtheye    schedule 14.01.2014
comment
@thefourtheye: Весь вопрос в том, почему Python Launcher запускает python 2 вместо, разумно, Python 3, так что ... не совсем.   -  person Wooble    schedule 14.01.2014
comment
Я только что отредактировал свой вопрос, чтобы включить это. Я не знал, что использую 2.7.5, пока не последовал инструкциям Кевина.   -  person chillpenguin    schedule 14.01.2014
comment
@chillpenguin: посмотрите диалог настроек для Python Launcher. По-видимому, по умолчанию не запускается версия, с которой он был установлен, что ... глупо. (Я никогда не использовал его сам; я считаю, что использовать Терминал лучше ...)   -  person Wooble    schedule 14.01.2014
comment
Спасибо, Вубл. Прямо сейчас в разделе prefences говорится: «Интерпретатор»: / usr / bin / pythonw. Это то, что я хочу изменить? На что мне его поменять?   -  person chillpenguin    schedule 14.01.2014
comment
#!/usr/bin/env python3 как первая строка   -  person Cosine    schedule 05.03.2017


Ответы (15)


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, а другой - _ 13_. Вы можете представить себе отношения между ними следующим образом

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

Соображения безопасности при использовании input Python 2.7:

Поскольку оцениваются все типы пользователей, это также создает проблемы с безопасностью. Например, если вы уже загрузили 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 есть только одна функция для получения пользовательского ввода, и она называется _ 37_, что эквивалентно raw_input в Python 2.7.

person thefourtheye    schedule 14.01.2014

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

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
person Community    schedule 14.01.2014

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

#!/usr/bin/env python3

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

#!/usr/bin/env python

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

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

#! python

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

#! python3

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

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

person Zim    schedule 09.08.2016

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

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

from six.moves import input

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

вы можете узнать больше о шести библиотеках здесь

person Elad L.    schedule 30.05.2019
comment
Это решило для меня. Спасибо - person Lahori; 26.05.2021

Вам следует использовать 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))
person Skiller Dz    schedule 06.05.2018

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

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

Ex:'dude' -> correct

    dude -> not correct
person Parminder Singh    schedule 14.07.2018

Для python 3 и более поздних версий

s = raw_input()

он решит проблему в pycharm IDE, если вы решаете на онлайн-сайте именно hackerrank, тогда используйте:

s = input()
person RAHUL KUMAR    schedule 23.02.2018

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

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

or:

x = str(input("enter your name"))
print "your name is %s" % x
person Abdullah Baraka    schedule 29.10.2017
comment
raw_input исправил проблему для меня - person Spencer Goff; 08.12.2017
comment
Но raw_input () недоступен в Python 3. - person carthurs; 03.09.2018

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

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

Для всех, кто может столкнуться с этой проблемой, оказывается, что даже если вы включите #!/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

person automonous    schedule 18.01.2017

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

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

Спасибо!

person Joe Llerena    schedule 28.03.2019

Есть два способа исправить эти проблемы:

  • 1-й - это просто без изменения кода, то есть
    запустите свой скрипт на Python3,
    если вы все еще хотите работать на python2, а затем после запуска вашего скрипта python, когда вы вводите ввод, имейте в виду

    1. if you want to enter string then just start typing down with "input goes with double-quote" and it will work in python2.7 and
    2. если вы хотите ввести символ, используйте ввод с одинарной кавычкой, например "ваш ввод идет сюда"
    3. если вы хотите ввести номер, а не проблема, просто введите номер
  • Второй способ - с изменениями кода
    используйте нижеприведенный импорт и запускайте с любой версией python

    1. from six.moves import input
    2. Используйте функцию raw_input() вместо функции input() в вашем коде при любом импорте
    3. продезинфицируйте свой код с помощью функции str(), такой как str(input()), а затем назначьте любой переменной

Как следует из ошибки: имя "чувак" не определено, т.е. для python "чувак" становится здесь переменной, и ему не присвоено какое-либо значение определенного типа Python,
поэтому только его плач, как ребенок поэтому, если мы определим переменную «чувак» и присвоим ей любое значение и передадим ей, она будет работать, но это не то, что мы хотим, поскольку мы не знаем, какой пользователь войдет, и, более того, мы хотим зафиксировать ввод пользователя.

Факт об этом методе:
input() функция: эта функция принимает значение и тип ввода, который вы вводите, без изменения его типа.
raw_input() функция: эта функция явно преобразует ввод вы вводите строку типа,

Примечание.
Уязвимость метода input () заключается в том, что к переменной, имеющей доступ к значению input, может получить доступ кто угодно, просто используя имя переменной или метода.

person Naval Kishor Jha    schedule 22.12.2019

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

print ("your name is" + input_variable)

to

print ("your name is", input_variable)

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

person Cleve Green    schedule 27.10.2017

Вот функция ввода, совместимая как с Python 2.7, так и с Python 3+: (Слегка измененный ответ @Hardian), чтобы избежать ошибки UnboundLocalError: local variable 'input' referenced before assignment

def input_compatible(prompt=None):
    try:
        input_func = raw_input
    except NameError:
        input_func = input
    return input_func(prompt)
person dux2    schedule 11.10.2020

Попробуйте использовать raw_input вместо input, если вы просто хотите читать строки.

print("Enter your name: ")
x = raw_input()
print("Hello, "+x)

Изображение содержит экран вывода

person Suman    schedule 11.07.2020