input()error - NameError:name'...'未定义

时间:2014-01-14 19:44:14

标签: python python-2.7 python-3.x input nameerror

当我尝试运行这个简单的python脚本时出现错误:

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

让我说我输入“dude”,我得到的错误是:

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?

15 个答案:

答案 0 :(得分:240)

<强> TL; DR

Python 2.7中的

input函数,作为Python表达式计算您输入的内容。如果您只是想读取字符串,那么在Python 2.7中使用raw_input函数,它不会评估读取字符串。

如果您使用的是Python 3.x,则raw_input已重命名为input。引用Python 3.0 release notes

  

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函数,如this answer中所示。

在python 3.x 中,只有一个函数可以获取用户输入,称为input,相当于Python 2.7的raw_input。< / p>

答案 1 :(得分:49)

您正在运行Python 2,而不是Python 3.为了在Python 2中运行,请使用raw_input

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)

答案 2 :(得分:14)

由于您是为Python 3.x编写的,因此您需要使用以下命令开始编写脚本:

#!/usr/bin/env python3

如果您使用:

#!/usr/bin/env python

默认为Python 2.x.如果没有任何东西以#!(又名shebang)开头,这些就会出现在脚本的第一行。

如果您的脚本只是以:

开头
#! python

然后您可以将其更改为:

#! python3

虽然这种较短的格式只能被少数程序识别,例如启动器,所以它不是最佳选择。

前两个示例使用得更为广泛,有助于确保您的代码可以在任何安装了Python的计算机上运行。

答案 3 :(得分:6)

您应该使用raw_input,因为您使用的是python-2.7。在变量上使用input()时(例如:s = input('Name: ')),它将在Python环境中执行命令,而不保存您在变量(s)上写的内容并创建错误如果你写的东西没有定义。

raw_input()将正确保存您在变量上写的内容(例如:f = raw_input('Name : ')),并且不会在Python环境中执行它而不会产生任何可能的错误:

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))

答案 4 :(得分:4)

对于python 3及以上

nodes =

    26    12     6     2

它将解决pycharm IDE上的问题 如果你在网站上完全解决hackerrank然后使用:

s = raw_input()

答案 5 :(得分:3)

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

您必须使用单引号或双引号输入

Ex:'dude' -> correct

    dude -> not correct

答案 6 :(得分:2)

对于可能遇到此问题的其他任何人,即使您在脚本的开头包含#!/usr/bin/env python3,如果文件不可执行,也会忽略shebang。

确定您的文件是否可执行:

  • 从命令行运行./filename.py
  • 如果您获得-bash: ./filename.py: Permission denied,请运行chmod a+x filename.py
  • 再次运行./filename.py

如果您已经将Kevin import sys; print(sys.version)包括在内,那么您现在可以看到该脚本正由python3解释

答案 7 :(得分:2)

你可以这样做:

x = raw_input("enter your name")
print "your name is %s " % x

或:

x = str(input("enter your name"))
print "your name is %s" % x

答案 8 :(得分:2)

我们使用的是同时适用于 python 2和python 3

的以下内容
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))

答案 9 :(得分:0)

你可以改变你在IDE中使用的python,如果你已经下载了python 3.x,那么切换起来应该不会太难。但是你的脚本在python 3.x上运行正常,我只想改变

print ("your name is" + input_variable)

print ("your name is", input_variable)

因为使用逗号,它会在your name is和用户输入的内容之间打印一个空格。 AND:如果您使用的是2.7,请使用raw_input而不是输入。

答案 10 :(得分:0)

以前的贡献很好。

let Vector2 = geometer.Vector2Impl;
Enter your name: Joe
('Hi ', 'Joe', <type 'str'>)
Hi Joe, bye 

Your name: Joe
Joe

谢谢!

答案 11 :(得分:0)

我还遇到了一个应该与python 2.7和3.7兼容的模块的问题

我发现要解决的问题正在导入:

from six.moves import input

这固定了两个口译员的可用性

您可以了解有关六个库here

的更多信息

答案 12 :(得分:0)

有两种方法可以解决这些问题,

  • 第一个简单,无需更改代码
    通过Python3运行脚本,
    如果您仍想在python2上运行, 运行python脚本后,输入输入时请记住

    1. 如果您想输入string,则只需使用“ input go with double-quote”输入即可,它将在python2.7和
    2. 中运行
    3. 如果您想输入字符,则使用单引号作为输入,例如“您的输入在此处”
    4. 如果您不想输入数字,只需输入数字
  • 第二种方法是更改​​代码
    使用下面的导入并运行任何版本的python

    1. from six.moves import input
    2. 在代码中使用raw_input()函数而不是input()函数进行任何导入
    3. 使用str()之类的str(input())函数对代码进行处理,然后将其分配给任何变量

错误提示
未定义名称'dude' 即对于python'dude'在这里成为变量,并且没有分配任何python定义的类型的值
,所以只有它哭了,就像婴儿一样,因此,如果我们定义'dude'变量并分配任何值并传递给它,它将可以,但这不是我们想要的,因为我们不知道用户将输入什么,而且我们还希望捕获用户的输入。

  

有关这些方法的事实:
  input()函数:此函数按原样使用您输入的输入的值和类型,而无需修改其类型。
raw_input()   函数:此函数将您提供的输入明确转换为字符串类型,   

     

注意:
input()方法中的漏洞在于   任何人都可以访问访问输入值的变量   只需使用变量或方法的名称即可。

答案 13 :(得分:0)

如果您只是想读取字符串,请尝试使用raw_input而不是input

print("Enter your name: ")
x = raw_input()
print("Hello, "+x)

Image contains the output screen

答案 14 :(得分:0)

这是一个与Python 2.7和Python 3+兼容的输入函数: (@Hardian稍作修改的答案)以避免UnboundLocalError: local variable 'input' referenced before assignment错误

def input_compatible(prompt=None):
    try:
        input_func = raw_input
    except NameError:
        input_func = input
    return input_func(prompt)