input()错误 – NameError:名称'…'未定义
当我尝试运行这个简单的Python脚本时出现错误:
input_variable = input ("Enter your name: ") print ("your name is" + input_variable)
可以说我input“伙计”,我得到的错误是:
line 1, in <module> input_variable = input ("Enter your name: ") File "<string>", line 1, in <module> NameError: name 'dude' is not defined
我运行的是Mac OS X 10.9.1,我使用Python 3.3的安装附带的Python Launcher应用程序来运行脚本。
编辑:我意识到我用2.7来运行这些脚本。 我想真正的问题是如何在3.3版本上运行我的脚本? 我想如果我将脚本拖放到我的应用程序文件夹中的Python 3.3文件夹内的Python Launcher应用程序的顶部,它将使用3.3启动我的脚本。 我想这个方法仍然启动2.7的脚本。 那么我如何使用3.3?
TL; DR
在Python 2.7中input
函数,以Pythonexpression式的forms评估你input的内容。 如果你只是想读取string,那么使用Python 2.7中的raw_input
函数,它不会计算读取的string。
如果您使用Python 3.x,则raw_input
已被重命名为input
。 引用Python 3.0发行说明 ,
raw_input()
被重命名为input()
。 也就是说,新的input()
函数从sys.stdin
读取一行,并将其后面的换行符去掉。 如果input提前终止,则会引发EOFError
。 为了得到input()
的旧行为,使用eval(input())
在Python 2.7中 ,有两个函数可以用来接受用户input。 一个是input
,另一个是raw_input
。 你可以想象它们之间的关系如下
input = eval(raw_input)
考虑下面的一段代码,以更好地理解这一点
>>> dude = "thefourtheye" >>> input_variable = input("Enter your name: ") Enter your name: dude >>> input_variable 'thefourtheye'
input
接受来自用户的string,并在当前Python上下文中评估string。 当我inputdude
作为input时,发现dude
被绑定到这个值,所以评估的结果变成了thefourtheye
,并且被赋值为input_variable
。
如果我在当前的python上下文中input了其他的东西,那么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
安全考虑:
由于无论用户types是否被评估,都会带来安全问题。 例如,如果您已经使用import os
在程序中加载了os
模块,然后用户input
os.remove("/etc/hosts")
这将被评估为一个函数调用expression式由python将被执行。 如果您使用提升的权限执行Python,则/etc/hosts
文件将被删除。 看,可能会有多危险?
为了演示这一点,让我们尝试再次执行input
function。
>>> dude = "thefourtheye" >>> input("Enter your name: ") Enter your name: input("Enter your name again: ") Enter your name again: dude
现在,当input("Enter your name: ")
被执行,它等待用户input,用户input是一个有效的Python函数调用,所以也被调用。 这就是为什么我们看到Enter your name again:
提示。
所以,你最好用raw_input
函数,就像这样
input_variable = raw_input("Enter your name: ")
如果您需要将结果转换为其他types,则可以使用适当的函数来转换由raw_input
返回的string。 例如,要将input作为整数读取,请使用int
函数, 如此答案中所示。
在python 3.x中 ,只有一个函数可以获得用户input,这个函数叫做input
,相当于Python 2.7的raw_input
。
您正在运行Python 2,而不是Python 3.为了在Python 2中运行,请使用raw_input
。
input_variable = raw_input ("Enter your name: ") print ("your name is" + input_variable)
由于您正在为Python 3.x编写代码,因此您需要使用以下代码开始脚本:
#!/usr/bin/env python3
如果你使用:
#!/usr/bin/env python
它将默认为Python 2.x. 如果没有以#开头的内容,这些将在脚本的第一行。 (又名shebang)。
如果你的脚本刚刚开始:
#! python
然后,您可以将其更改为:
#! python3
虽然这个较短的格式只能被一些程序识别,比如启动器,所以它不是最好的select。
前两个例子被广泛使用,并有助于确保您的代码可以在任何安装了Python的机器上运行。
对于任何可能遇到此问题的人来说,即使您在脚本的开头包含#!/usr/bin/env python3
,如果文件不可执行,shebang也会被忽略。
要确定您的文件是否可执行:
- 从命令行运行
./filename.py
- 如果你得到
-bash: ./filename.py: Permission denied
chmod a+x filename.py
-bash: ./filename.py: Permission denied
,运行chmod a+x filename.py
- 再次运行
./filename.py
如果你已经包含了import sys; print(sys.version)
按照Kevin的build议import sys; print(sys.version)
,现在你会看到脚本正在被python3解释
你可以改变你正在使用的IDE的Python,如果你已经下载了python 3.x它不应该太难切换。 但是你的脚本在Python 3.x上正常工作,我只是改变
print ("your name is" + input_variable)
至
print ("your name is", input_variable)
因为用逗号打印时your name is
和用户input的your name is
空格。 AND:如果你使用2.7只是使用raw_input
而不是input。
你可以做
x = raw_input("enter your name") print "your name is %s " % x
要么
x = str(input("enter your name")) print "your name is %s" % x