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
.
input
вести себя так, но только в 2.7. Что он говорит, когда вы запускаетеpython --version
из командной строки? В качестве альтернативы, что если вы напишитеimport sys; print(sys.version)
в начале вашего сценария?