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
, а другой - _ 13_. Вы можете представить себе отношения между ними следующим образом
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
Соображения безопасности при использовании input
Python 2.7:
Поскольку оцениваются все типы пользователей, это также создает проблемы с безопасностью. Например, если вы уже загрузили 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 есть только одна функция для получения пользовательского ввода, и она называется _ 37_, что эквивалентно raw_input
в Python 2.7.
person
thefourtheye
schedule
14.01.2014
input
будет вести себя так, но только в версии 2.7. Что он говорит, когда вы запускаетеpython --version
из командной строки? В качестве альтернативы, что, если вы напишетеimport sys; print(sys.version)
в начале вашего скрипта? - person Kevin   schedule 14.01.2014import sys
и второй строкиprint(sys.version_info)
, чтобы определить, какую версию вы используете. - person Hyperboreus   schedule 14.01.2014#!/usr/bin/env python3
как первая строка - person Cosine   schedule 05.03.2017