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)в начале вашего сценария?