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-02-03 01:02:42 【问题描述】:

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

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

您运行的是 Python 2,而不是 Python 3。要使其在 Python 2 中运行,请使用 raw_input

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

#!/usr/bin/env python3

如果你使用:

#!/usr/bin/env python

它将默认为 Python 2.x。如果没有以 #! 开头的内容(又名 shebang),则这些内容位于脚本的第一行。

如果您的脚本开头是:

#! python

那你可以改成:

#! python3

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

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

【讨论】:

【参考方案4】:

对于可能遇到此问题的任何其他人,事实证明,即使您在脚本开头包含 #!/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 解释

【讨论】:

【参考方案5】:

如果你已经下载了 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 而不是输入。

【讨论】:

【参考方案6】:

你可以这样做:

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 中不可用。【参考方案7】:

适用于 python 3 及以上版本

s = raw_input()

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

s = input()

【讨论】:

raw_input 未在 Python 3 中定义。这是“Python 2”的拼写错误吗?【参考方案8】:

您应该使用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))

【讨论】:

【参考方案9】:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

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

Ex:'dude' -> correct

    dude -> not correct

【讨论】:

【参考方案10】:

我们正在使用以下适用于 python 2 和 python 3

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

【讨论】:

【参考方案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: "))
输入您的姓名:乔
('嗨', '乔', &lttype 'str'&gt)
嗨乔,再见

你的名字:乔
乔

谢谢!

【讨论】:

【参考方案12】:

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

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

from six.moves import input

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

你可以阅读更多关于六库here

【讨论】:

【参考方案13】:

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

第一个很简单,无需更改代码,即通过 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() 方法的漏洞在于: 任何人都可以访问访问输入值的变量 只需使用变量或方法的名称即可。

【讨论】:

【参考方案14】:

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

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

【讨论】:

【参考方案15】:

这是一个兼容 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 块用于您可以轻松提前检查的情况,但在这种情况下,它没有任何性能下降并且在我看来比替代方案更干净。 不是每个问题都可以或应该单独使用标准库来解决。【参考方案16】:

使用下面的代码:

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

【讨论】:

以上是关于input() 错误 - NameError: name '...' is not defined的主要内容,如果未能解决你的问题,请参考以下文章

输入():“NameError:名称'n'未定义”[重复]

MNIST-NameError: name ‘input_data’ is not defined解决办法

input()返回Traceback(最近一次调用):NameError:未定义名称'___'的文件,“,第1行,

python 中的错误NameError: name 'sklearn' is not defined

NameError: global name ‘***‘ is not defined

NameError: global name ‘***‘ is not defined