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

chi*_*uin 193 python input nameerror python-2.7

我尝试运行这个简单的python脚本时收到错误:

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Run Code Online (Sandbox Code Playgroud)

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

line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
Run Code Online (Sandbox Code Playgroud)

我正在运行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?

the*_*eye 253

TL; DR

inputPython 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)
Run Code Online (Sandbox Code Playgroud)

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

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Python 2.7的安全注意事项input:

由于评估了任何用户类型,因此它也会带来安全问题.例如,如果您已经os在程序中加载了模块import os,然后用户输入了

os.remove("/etc/hosts")
Run Code Online (Sandbox Code Playgroud)

这将被python评估为函数调用表达式,并将被执行.如果使用提升的权限执行Python,/etc/hosts则将删除文件.看,它有多危险?

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

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Run Code Online (Sandbox Code Playgroud)

现在,当input("Enter your name: ")执行时,它等待用户输入,并且用户输入是有效的Python函数调用,因此也会调用它.这就是我们Enter your name again:再次看到提示的原因.

所以,你最好的raw_input功能就像这样

input_variable = raw_input("Enter your name: ")
Run Code Online (Sandbox Code Playgroud)

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

在python 3.x中,只有一个函数可以获取用户输入并被调用input,这相当于Python 2.7 raw_input.


小智 52

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

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
Run Code Online (Sandbox Code Playgroud)


Zim*_*Zim 15

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

#!/usr/bin/env python3
Run Code Online (Sandbox Code Playgroud)

如果您使用:

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

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

如果你的脚本刚开始:

#! python
Run Code Online (Sandbox Code Playgroud)

然后你可以将它改为:

#! python3
Run Code Online (Sandbox Code Playgroud)

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

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


Ela*_* L. 7

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

我发现解决问题的方法是导入:

from six.moves import input
Run Code Online (Sandbox Code Playgroud)

这修复了两个解释器的可用性

您可以在此处阅读有关六个图书馆的更多信息


Ski*_* Dz 6

你应该使用raw_input,因为你正在使用python-2.7,当你在变量上使用input()时:s = input('Name:'),它将执行Python环境中的命令而不保存你在变量上写的内容(s)并创建错误如果你写的不是Definied,那么,你可以使用raw_input(),它会正确保存你在变量上写的内容,例如:f = raw_input('Name:')它不会在python环境中执行它而不创建任何可能的错误

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
Run Code Online (Sandbox Code Playgroud)


小智 5

对于python 3及以上

s = raw_input()
Run Code Online (Sandbox Code Playgroud)

如果您正在在线网站上解决hackerrank,它将解决pycharm IDE上的问题,然后使用:

s = input()
Run Code Online (Sandbox Code Playgroud)


Par*_*ngh 5

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
Run Code Online (Sandbox Code Playgroud)

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

Ex:'dude' -> correct

    dude -> not correct
Run Code Online (Sandbox Code Playgroud)


Sum*_*man 5

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

print("Enter your name: ")
x = raw_input()
print("Hello, "+x)
Run Code Online (Sandbox Code Playgroud)

图像包含输出屏幕