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.
inputщо так поводитись, але лише у 2,7. Що це говорить при запускуpython --versionз командного рядка? Як варіант, що робити, якщо ви пишетеimport sys; print(sys.version)на початку свого сценарію?