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文件将被删除。 看,可能会有多危险?

为了演示这一点,让我们尝试再次执行inputfunction。

 >>> 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