input() 错误 - NameError: name '...' is not defined
Posted
技术标签:
【中文标题】input() 错误 - NameError: name \'...\' is not defined【英文标题】:input() error - NameError: name '...' is not definedinput() 错误 - NameError: name '...' is not defined 【发布时间】:2014-01-14 19:44:14 【问题描述】:当我尝试运行这个简单的脚本时出现错误:
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 应用程序来运行脚本。
【问题讨论】:
你确定是 Python 3.3 吗?我希望input
以这种方式行事,但仅限于 2.7。当您从命令提示符运行python --version
时它会说什么?或者,如果您在脚本开头写 import sys; print(sys.version)
会怎样?
你运行的不是 Python 3。你运行的是 Python 2,不知何故(我不熟悉这个“Python Launcher”应用)
将import sys
作为第一行,print(sys.version_info)
作为第二行,以确定您使用的版本。
我按照凯文所说的做了,它是 2.7.5 版!我不确定如何。我下载并安装了 3.3 版,在我的应用程序文件夹中有一个名为“Python 3.3”的文件夹,该文件夹中有一个名为“Python Launcher”的应用程序,我通过将脚本拖放到 Python Launcher 应用程序上来运行我的脚本.为什么我在使用 3.3 启动器应用时还在使用 2.7?
@chillpenguin:查看 Python 启动器的首选项对话框。显然,它并不默认运行安装它的版本,这是......愚蠢的。 (我自己从未使用过它;我发现使用终端更好......)
【参考方案1】:
TL;DR
input
Python 2.7 中的函数,将您输入的任何内容作为 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
:
由于评估了任何用户类型,它也会带来安全问题。例如,如果您已经在程序中使用import os
加载了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
。
【讨论】:
【参考方案2】:您运行的是 Python 2,而不是 Python 3。要使其在 Python 2 中运行,请使用 raw_input
。
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
【讨论】:
【参考方案3】:由于您是为 Python 3.x 编写的,因此您需要以以下方式开始您的脚本:
#!/usr/bin/env python3
如果你使用:
#!/usr/bin/env python
它将默认为 Python 2.x。如果没有以 #! 开头的任何内容(又名 shebang),则这些内容位于脚本的第一行。
如果您的脚本开头是:
#! python
那你可以改成:
#! python3
虽然这种较短的格式只能被少数程序识别,例如启动器,所以它不是最佳选择。
前两个示例使用更广泛,将有助于确保您的代码可以在任何安装了 Python 的机器上运行。
【讨论】:
【参考方案4】:我在一个应该与 python 2.7 和 3.7 兼容的模块上也遇到了这个问题
我发现解决问题的方法是导入:
from six.moves import input
这修复了两个解释器的可用性
你可以阅读更多关于六库here
【讨论】:
【参考方案5】:您应该使用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))
【讨论】:
【参考方案6】:input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
您必须在单引号或双引号中输入输入
Ex:'dude' -> correct
dude -> not correct
【讨论】:
【参考方案7】:适用于 python 3 及以上版本
s = raw_input()
它将解决pycharm IDE上的问题 如果您正在在线网站上解决hackerrank,请使用:
s = input()
【讨论】:
raw_input
未在 Python 3 中定义。这是“Python 2”的拼写错误吗?【参考方案8】:
我们正在使用以下适用于 python 2 和 python 3
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
【讨论】:
【参考方案9】:对于可能遇到此问题的任何其他人,事实证明,即使您在脚本开头包含 #!/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 解释
【讨论】:
【参考方案10】:你可以这样做:
x = raw_input("enter your name")
print "your name is %s " % x
或:
x = str(input("enter your name"))
print "your name is %s" % x
【讨论】:
raw_input 为我解决了这个问题 但是 raw_input() 在 Python 3 中不可用。【参考方案11】:以前的贡献不错。
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: "))
输入您的姓名:乔 ('嗨', '乔', <type 'str'>) 嗨乔,再见 你的名字:乔 乔
谢谢!
【讨论】:
【参考方案12】:有两种方法可以解决这些问题,
第一个很简单,无需更改代码,即通过 Python3 运行您的脚本,如果您仍想在 python2 上运行,那么 运行你的python脚本后,当你输入输入时,请记住
-
如果你想输入
string
,那么只需开始输入“输入带有双引号”,它将在python2.7和中工作
如果您想输入字符,请使用带单引号的输入,例如“您的输入在此处”
如果您想输入数字而不是问题,只需输入数字即可
第二种方法是更改代码 使用以下导入并使用任何版本的 python 运行
from six.moves import input
在您的代码中使用 raw_input()
函数而不是 input()
函数进行任何导入
使用str()
函数(如str(input())
)清理您的代码,然后分配给任何变量
如错误所示:未定义名称“dude” 即对于 python 'dude' 在这里变成变量并且它没有分配任何 python 定义类型的值所以只有它像婴儿一样哭泣所以如果我们定义一个 'dude' 变量并分配任何值并传递给它,它将起作用但这不是我们想要的,因为我们不知道用户会输入什么,而且我们想要捕获用户输入。
关于这些方法的事实:
input()
函数:该函数采用您输入的输入的值和类型,而不修改它的类型。raw_input()
函数:此函数将您输入的输入显式转换为字符串类型,注意: input() 方法的漏洞在于: 任何人都可以访问访问输入值的变量 只需使用变量或方法的名称即可。
【讨论】:
【参考方案13】:如果您只是想读取字符串,请尝试使用raw_input
而不是input
。
print("Enter your name: ")
x = raw_input()
print("Hello, "+x)
【讨论】:
【参考方案14】:如果你已经下载了 python 3.x,你可以改变你在 IDE 中使用的 python,切换应该不会太难。但是您的脚本在 python 3.x 上运行良好,我会更改
print ("your name is" + input_variable)
到
print ("your name is", input_variable)
因为使用逗号,它会在 your name is
和用户输入的任何内容之间打印一个空格。并且:如果您使用的是 2.7,只需使用 raw_input
而不是输入。
【讨论】:
【参考方案15】:使用下面的代码:
print("Enter your name: ")
a = raw_input()
print("Hello, "+a)
【讨论】:
【参考方案16】:我有同样的错误,我已经有了最新的 python3 版本。我所做的只是更改设置中的解释器。之后它应该可以正常工作。我按照这里的步骤https://www.jetbrains.com/help/pycharm/configuring-python-interpreter.html#add_new_project_interpreter
【讨论】:
【参考方案17】:这是一个兼容 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)
这里还有另一个没有try
块的替代方案:
def input_compatible(prompt=None):
input_func = raw_input if "raw_input" in __builtins__.__dict__ else input
return input_func(prompt)
【讨论】:
如果你需要支持 Python 2 和 Python 3,你应该使用six
库,它提供了six.input
。如果您使用的是 Python 3,则没有理由每次调用 input_compatible
时都捕获 NameError
。
有时你不想依赖任何非标准的包,例如在编写可移植的 shell 脚本时,所以这个答案有它的位置和理由。
这仍然不能成为每次尝试调用函数时都使用try
语句的借口。 raw_input
不会在你的脚本执行时突然出现;它要么在开始时可用,要么根本不可用。此外,如果您需要两个版本之间的兼容性,您可能需要很多 来适应,不使用six
是没有意义的。
请原谅@chepner,但我不同意你的看法。首先,对于需要可移植解决方案并且不能使用 any 非标准包的用例,您没有提供更好的替代方案。既然你没有,我编辑了我的答案以包括这些。其次,虽然我通常同意您的观点,即您不应该使用 try
块用于您可以轻松提前检查的情况,但在这种情况下,它没有任何性能下降并且在我看来比替代方案更干净。
不是每个问题都可以或应该单独使用标准库来解决。以上是关于input() 错误 - NameError: name '...' is not defined的主要内容,如果未能解决你的问题,请参考以下文章
MNIST-NameError: name ‘input_data’ is not defined解决办法
input()返回Traceback(最近一次调用):NameError:未定义名称'___'的文件,“,第1行,
python 中的错误NameError: name 'sklearn' is not defined