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

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

提问人:chillpenguin 提问时间:1/15/2014 最后编辑:wjandreachillpenguin 更新时间:3/28/2023 访问量:917907

问:

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

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

假设我输入“伙计”,我得到的错误是:

  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-2.7 输入 名称错误

评论

18赞 Kevin 1/15/2014
你确定是 Python 3.3 吗?我希望以这种方式行事,但仅限于 2.7。当您从命令提示符运行时,它说什么?或者,如果你在脚本的开头写呢?inputpython --versionimport sys; print(sys.version)
3赞 Wooble 1/15/2014
您没有运行 Python 3。您正在以某种方式运行 Python 2(我不熟悉这个“Python Launcher”应用程序)
1赞 Hyperboreus 1/15/2014
作为第一行和第二行,以确定您正在使用的版本。import sysprint(sys.version_info)
4赞 chillpenguin 1/15/2014
我按照凯文说的做了,它是 2.7.5 版!我不确定怎么回事。我下载并安装了 3.3 版,在我的应用程序文件夹中有一个名为“Python 3.3”的文件夹,该文件夹中有一个名为“Python Launcher”的应用程序,我通过将它们拖放到 Python Launcher 应用程序来运行我的脚本。当我使用 2.7 启动器应用程序时,为什么我仍然使用 3.3?
2赞 Wooble 1/15/2014
@chillpenguin:查看 Python Launcher 的“首选项”对话框。显然,它并不默认运行安装它的版本,即......哑。(我自己从未使用过;我发现使用终端更好......

答:

61赞 user2534732 1/15/2014 #1

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

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
299赞 thefourtheye 1/15/2014 #2

TL的;博士

inputPython 2.7 中的函数,将您输入的任何内容作为 Python 表达式进行评估。如果您只是想读取字符串,请使用 Python 2.7 中的函数,它不会计算读取的字符串。raw_input

如果您使用的是 Python 3.x,则已重命名为 。引用 Python 3.0 发行说明raw_inputinput

raw_input()已重命名为 。也就是说,新函数从中读取一行,并在剥离尾随换行符的情况下返回该行。如果输入过早终止,则会引发输入。要获取 的旧行为,请使用input()input()sys.stdinEOFErrorinput()eval(input())


在 Python 2.7 中,有两个函数可用于接受用户输入。一个是输入,另一个是raw_input。您可以将它们之间的关系想象如下

input = eval(raw_input)

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

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

input接受来自用户的字符串,并在当前 Python 上下文中计算该字符串。当我输入输入时,它发现它与值绑定,因此计算结果变为 并分配给 。dudedudethefourtheyethefourtheyeinput_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 输入的安全注意事项:

由于评估的是任何用户类型,因此它也会带来安全问题。例如,如果您已经使用 在程序中加载了模块,然后用户键入osimport 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

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

所以,你最好使用这样的功能raw_input

input_variable = raw_input("Enter your name: ")

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

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

18赞 Zim 8/9/2016 #3

由于您正在为 Python 3.x 编写脚本,因此您需要从以下位置开始编写脚本:

#!/usr/bin/env python3

如果您使用:

#!/usr/bin/env python

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

如果您的脚本仅以以下方式开头:

#! python

然后,您可以将其更改为:

#! python3

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

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

2赞 automonous 1/19/2017 #4

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

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

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

如果你按照 Kevin 的建议包含了脚本,你现在会看到脚本正在被 python3 解释import sys; print(sys.version)

1赞 Cleve Green 10/27/2017 #5

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

print ("your name is" + input_variable)

print ("your name is", input_variable)

因为使用逗号时,它会在两者之间以及用户输入的任何内容之间留出空格。并且:如果您使用的是 2.7,请使用而不是输入。your name israw_input

3赞 Abdullah Baraka 10/30/2017 #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

评论

1赞 Spencer Goff 12/9/2017
raw_input为我解决了这个问题
0赞 carthurs 9/4/2018
但是 raw_input() 在 Python 3 中不可用。
0赞 Abdullah Baraka 8/15/2023
@carthurs 是的,输入现在默认为字符串
5赞 RAHUL KUMAR 2/23/2018 #7

对于 python 3 及更高版本

s = raw_input()

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

s = input()

评论

0赞 wjandrea 11/23/2021
raw_input未在 Python 3 中定义。这是“Python 2”的错别字吗?
6赞 Skiller Dz 5/7/2018 #8

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

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

input_variable = raw_input('Enter Your Name : ')
print("Your Name Is  : " + (input_variable))
5赞 Parminder Singh 7/14/2018 #9
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

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

Ex:'dude' -> correct

    dude -> not correct
4赞 Hardian 2/6/2019 #10

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

#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
2赞 Joe Llerena 3/29/2019 #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: "))
Enter your name: Joe
('Hi ', 'Joe', <type 'str'>)
Hi Joe, bye 

Your name: Joe
Joe

谢谢!

9赞 Elad L. 5/30/2019 #12

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

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

from six.moves import input

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

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

4赞 Naval Kishor Jha 12/22/2019 #13

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

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

    1. 如果你想输入,那么只需开始输入“输入带双引号”,它将在 python2.7 和string
    2. 如果您想输入字符,请使用带有单引号的输入,例如“您的输入在这里”
    3. 如果您想输入数字不是问题,您只需输入数字即可
  • 第二种方法是更改代码,
    使用以下导入并使用任何版本的 Python 运行

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

正如错误所暗示的那样:
名称“dude”未定义 即对于 python 来说,“伙计”在这里变成了变量,它没有分配任何 python 定义类型的值,所以只有它像婴儿一样哭泣,所以如果我们定义一个“伙计”变量并分配
任何值并传递给它,它会起作用,但这不是我们想要的,因为我们不知道哪个用户会输入,而且我们想要捕获用户输入。

关于这些方法的事实: 函数:
此函数按原样接受您输入的输入的值和类型,而不修改其类型。
function:此函数显式将您给出的输入转换为字符串类型,
input()raw_input()

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

4赞 Suman 7/11/2020 #14

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

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

Image contains the output screen

-1赞 dux2 10/11/2020 #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)

评论

0赞 chepner 9/6/2021
如果您需要支持 Python 2 和 Python 3,您应该使用该库,该库提供 .如果您使用的是 Python 3,则没有理由每次调用都捕获一个。sixsix.inputNameErrorinput_compatible
0赞 dux2 9/7/2021
有时你不想依赖任何非标准的包,例如在编写可移植的 shell 脚本时,所以这个答案有它的位置和理由。
1赞 chepner 9/7/2021
这仍然不能成为每次尝试调用函数时都使用语句的借口。 不会在脚本执行时突然出现;它要么在开始时可用,要么根本不可用。此外,如果您需要两个版本之间的兼容性,则可能需要容纳很多东西,并且不使用是没有意义的。tryraw_inputsix
0赞 dux2 9/9/2021
请原谅@chepner,但我不同意你的看法。首先,您没有为需要可移植解决方案且不能使用任何非标准软件包的用例提供更好的替代方案。既然你没有,我就编辑了我的答案,包括这样的答案。其次,虽然我通常同意你的观点,即你不应该在可以轻松提前检查的情况下使用块,但在这种情况下,它没有任何性能缺点,而且在我看来看起来比替代方案更干净。try
0赞 chepner 9/9/2021
并非每个问题都可以或应该单独使用标准库来解决。