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


220

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

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.


12
Вы уверены, что это Python 3.3? Я бы ожидал, что буду inputвести себя так, но только в 2.7. Что он говорит, когда вы запускаете python --versionиз командной строки? В качестве альтернативы, что если вы напишите import sys; print(sys.version)в начале вашего сценария?
Кевин

1
Вы не используете Python 3. Вы как-то используете Python 2 (я не знаком с этим приложением «
Запуск из

1
Поставьте в качестве первой import sysи второй строки print(sys.version_info), чтобы определить, какую версию вы используете.
Гиперборей

1
Я сделал то, что сказал Кевин, и это версия 2.7.5! Я не уверен, как, хотя. Я скачал и установил версию 3.3, в моей папке приложений есть папка, которая называется «Python 3.3», внутри этой папки есть приложение под названием «Python Launcher», и я запускаю свои скрипты, перетаскивая их в приложение Python Launcher. , Почему я все еще использую 2.7, когда я использую приложение запуска 3.3?
Чилпенгвин

2
@chillpenguin: откройте диалоговое окно «Настройки» для Python Launcher. По-видимому, он не по умолчанию работает с версией, с которой он был установлен, что ... глупо. (Я никогда не использовал его сам; я считаю, что лучше использовать Терминал ...)
Wooble

Ответы:


266

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.


56

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

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

17

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

#!/usr/bin/env python3

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

#!/usr/bin/env python

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

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

#! python

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

#! python3

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

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


6

Вы должны использовать, 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()


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

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

Ex:'dude' -> correct

    dude -> not correct

4

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

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

from six.moves import input

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

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


3

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

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

2

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

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

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

Ваше имя: Джо
Джо

Спасибо!


1

Вы можете изменить, какой 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вместо ввода.


1

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

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

    1. если вы хотите войти, stringтогда просто начните вводить «ввод идет с двойной кавычкой», и это будет работать в python2.7 и
    2. если вы хотите ввести символ, используйте ввод с одинарной кавычкой, например, «ваш ввод идет сюда»
    3. если вы хотите ввести номер не проблема, вы просто введите номер
  • 2-й способ - с изменениями кода
    используйте приведенный ниже импорт и работайте с любой версией python

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.