помилка 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 (я не знайомий з цим додатком "Запуск Python")
Wooble

1
Поставте як перший рядок import sysі як другий рядок print(sys.version_info), щоб визначити, яку версію ви використовуєте.
Гіперборей

1
Я зробив те, що сказав Кевін, і це версія 2.7.5! Я не впевнений, як все-таки. Я завантажив і встановив версію 3.3, у папці моїх додатків є папка, яка називається "Python 3.3", всередині цієї папки є додаток під назвою "Python Launcher", і я запускаю свої сценарії, перетягуючи їх на додаток Python Launcher. . Чому я все ще використовую 2.7, коли я використовую програму запуску 3.3?
chillpenguin

2
@chillpenguin: перегляньте діалогове вікно налаштувань для запуску Python. Мабуть, це не за замовчуванням для запуску версії, з якою вона була встановлена, яка є ... німою. (Я ніколи його не використовував; я вважаю, що краще використовувати Термінал ...)
Wooble

Відповіді:


265

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.

Якщо я введу щось інше, чого немає в поточному контексті пітона, це не вдасться 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: '):), вона виконає команду ON оточення 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на початку свого сценарію, шебанг ігнорується, якщо файл не виконується.

Щоб визначити, чи виконується ваш файл, виконайте такі дії:

  • запустити ./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

Є два способи виправити ці проблеми,

  • 1-й простий без зміни коду, який
    запускається вашим сценарієм Python3,
    якщо ви все ще хочете запустити на python2, то після запуску сценарію python, коли ви вводите вхід, майте на увазі

    1. якщо ви хочете ввести, stringпросто почніть вводити текст "вхід йде з подвійною цитатою", і він буде працювати в python2.7 і
    2. якщо ви хочете ввести символ, тоді використовуйте введення з однією цитатою, наприклад "ваш вхід йде сюди"
    3. якщо ви хочете ввести номер, а не проблему, просто введіть номер
  • Другий спосіб - при зміні коду
    використовуйте нижче імпорт та запустіть будь-яку версію python

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

Як випливає з помилки :
ім'я 'dude' не визначено, тобто для python 'dude' стає змінним тут, і воно не має жодного значення визначеного типу python,
тому присвоюється лише його плач, як baby, якщо ми визначимо змінну 'dude' і призначимо будь-яке значення і переходимо до нього, воно буде працювати, але це не те, чого ми хочемо, оскільки ми не знаємо, що введе користувач, і, крім того, ми хочемо зафіксувати дані користувача.

Факт про цей метод:
input() функція: Ця функція приймає значення та тип введеного вами вводу таким, яким він є, не змінюючи його тип.
raw_input() функція: Ця функція явно перетворює введений вами вхідний рядок,

Примітка
. Уразливість методу input () полягає в тому, що до змінної, що отримує доступ до значення вводу, може отримати доступ будь-хто лише за допомогою імені змінної чи методу.


0

Ви можете змінити, який пітон ви використовуєте зі своїм 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замість введення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.