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)
在脚本的开头编写该怎么办?