关于python:input()error – NameError:name’…’未定义

input() error - NameError: name '…' is not defined

当我尝试运行这个简单的python脚本时,我遇到了一个错误:

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

假设我输入"dude",我得到的错误是:

1
2
3
4
line 1, in <module>
input_variable = input ("Enter your name:")
File"<string>", line 1, in <module>
NameError: name 'dude' is not defined

我运行的是macosx10.9.1,我使用的是安装了python 3.3的python启动器应用程序来运行脚本。

编辑:我意识到我在用2.7运行这些脚本。我想真正的问题是如何在3.3版中运行我的脚本?我想,如果我把脚本拖到应用程序文件夹中python 3.3文件夹中的python launcher应用程序上面,它将使用3.3启动脚本。我想这个方法仍然使用2.7启动脚本。那么我如何使用3.3呢?


DR

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

如果您使用的是python 3.x,那么raw_input已重命名为input。引用了python 3.0发行说明,

raw_input() was renamed to input(). That is, the new input() function reads a line from sys.stdin and returns it with the trailing newline stripped. It raises EOFError if the input is terminated prematurely. To get the old behavior of input(), use eval(input())

在Python2.7中,有两个函数可以用来接受用户输入。一个是input,另一个是raw_input。你可以认为他们之间的关系如下

1
input = eval(raw_input)

考虑下面的代码以更好地理解这一点

1
2
3
4
5
>>> dude ="thefourtheye"
>>> input_variable = input("Enter your name:")
Enter your name: dude
>>> input_variable
'thefourtheye'

input接受用户的字符串,并在当前的python上下文中计算该字符串。当我输入dude时,发现dudethefourtheye的值绑定,因此评估结果变成thefourtheye并分配给input_variable的值。

如果我输入当前python上下文中没有的其他内容,那么NameError将失败。

1
2
3
4
5
6
>>> 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的安全考虑:

因为无论评估什么用户类型,它也会带来安全问题。例如,如果您已经使用import os在程序中加载了os模块,然后用户键入

1
os.remove("/etc/hosts")

这将由python作为函数调用表达式进行计算并执行。如果您以提升的权限执行python,那么将删除/etc/hosts文件。看,可能有多危险?

为了证明这一点,让我们再次尝试执行input函数。

1
2
3
4
>>> 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函数,就像这样

1
input_variable = raw_input("Enter your name:")

如果需要将结果转换为其他类型,那么可以使用适当的函数来转换raw_input返回的字符串。例如,要将输入读取为整数,请使用int函数,如此答案所示。

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


您运行的是python 2,而不是python 3。为了在python 2中工作,请使用raw_input

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


因为您是为python 3.x编写的,所以您需要从以下内容开始编写脚本:

1
#!/usr/bin/env python3

如果使用:

1
#!/usr/bin/env python

它将默认为python 2.x。如果没有以开头的内容,这些内容将出现在脚本的第一行。(又名舍邦)。

如果脚本只是以以下内容开始:

1
#! python

然后您可以将其更改为:

1
#! python3

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

前两个示例的使用范围更广,有助于确保您的代码可以在安装了Python的任何计算机上工作。


您应该使用raw_input,因为您使用的是python-2.7。在变量(例如:s = input('Name: ')上使用input()时,它将在python环境中执行命令,而不保存您在变量(s上所写的内容,如果您所写的内容未定义,则会产生错误。

raw_input()将正确保存您在变量上所写的内容(例如:f = raw_input('Name : ')),并且在不创建任何可能的错误的情况下,它不会在python环境中执行它:

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

对于python 3及更高版本

1
s = raw_input()

它将解决Pycharm IDE上的问题如果您正在在线网站上解决黑客排名问题,请使用:

1
s = input()

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

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

1
2
3
Ex:'dude' -> correct

    dude -> not correct


我们使用的是同时适用于python 2和python 3的以下代码

1
2
3
4
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name:"))

你可以这样做:

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

或:

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


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

要确定文件是否可执行,请执行以下操作:

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

如果你像凯文建议的那样加入了import sys; print(sys.version),现在你会看到脚本被python3解释了。


前功尽弃。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys; print(sys.version)

def ingreso(nombre):
    print('Hi ', nombre, type(nombre))

def bienvenida(nombre):
    print("Hi"+nombre+", bye")

nombre = raw_input("Enter your name:")

ingreso(nombre)
bienvenida(nombre)

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Your name:"))
1
2
3
4
5
6
Enter your name: Joe
('Hi ', 'Joe', &lttype 'str'&gt)
Hi Joe, bye

Your name: Joe
Joe

谢谢!


如果您已经下载了python 3.x,那么可以更改您在IDE中使用的python,这不应该太难切换。但是你的脚本在python 3.x上运行得很好,我只想更改一下

1
print ("your name is" + input_variable)

1
print ("your name is", input_variable)

因为它使用逗号在your name is和用户输入的任何内容之间打印空白。而且:如果您使用2.7,只需使用raw_input而不是input。