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)
на початку свого сценарію?