为什么在使用输入函数(在 Python 2.x 中)时会出现“NameError:名称‘...’未定义”(或 SyntaxError,或出现数字而不是字符串)?

2024-11-18 08:41:00
admin
原创
20
摘要:问题描述:当我尝试运行这个简单的脚本时出现错误:input_variable = input("Enter your name: ") print("your name is" + input_variable) 假设我输入“dude”,我收到的错误是: line 1...

问题描述:

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

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 应用程序来运行该脚本。


尽管原始问题专门询问的是 a NameError,但同样的问题也是SyntaxError由于尝试输入(例如,空白行或任何不能理解为 Python 表达式的内容)而导致 s 的原因。

此问题通常是因为无意中使用了 2.x 版本的 Python来运行代码而发生的。请参阅如何检查哪个版本的 Python 正在运行我的脚本?以获取帮助。


解决方案 1:

总结

inputPython 2.7 中的函数会将您输入的任何内容作为 Python 表达式进行求值。如果您只是想读取字符串,那么请使用raw_inputPython 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)

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

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

由于用户输入的任何内容都会被评估,因此它也会带来安全问题。例如,如果你已经os在程序中加载了模块import 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函数,如本答案中所示。

在 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

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

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

解决方案 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:

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

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

图像包含输出屏幕

解决方案 7:

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

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

Ex:'dude' -> correct

    dude -> not correct

解决方案 8:

对于 Python 3 及以上版本

s = raw_input()

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

s = input()

解决方案 9:

我们使用以下适用于Python 2 和 Python 3 的方法

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

解决方案 10:

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

  • 第一种方法很简单,无需更改代码,只需

使用 Python3 运行脚本即可。

如果您仍想在 python2 上运行,则在运行 python 脚本后,输入时请记住

1. 如果你想输入`string`,那么只需开始输入“输入带双引号”,它将在 python2.7 中工作,并且
2. 如果你想输入字符,那么使用带单引号的输入,如“你的输入在这里”
3. 如果你想输入数字,这不是问题,你只需输入数字
  • 第二种方法是更改​​代码,

使用下面的导入并使用任何版本的 Python 运行

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

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

关于这些方法的事实:

input()函数:此函数按原样获取您输入的值和类型,而不修改其类型。
raw_input()
函数:此函数明确将您提供的输入转换为字符串类型,

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

解决方案 11:

你可以这样做:

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

或者:

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

解决方案 12:

对于可能遇到此问题的其他任何人来说,即使你#!/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 解释

解决方案 13:

以前的贡献很好。

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: "))
输入您的姓名:Joe
('嗨','乔',<type'str'>)
嗨,乔,再见

你的名字:乔
乔

谢谢!

解决方案 14:

你可以更改你正在使用 IDE 的 Python,如果你已经下载了 Python 3.x,那么切换应该不太难。但是你的脚本在 Python 3.x 上运行良好,我只需更改

print ("your name is" + input_variable)

print ("your name is", input_variable)

因为使用逗号时,它会在逗号your name is和用户输入的内容之间打印一个空格。并且:如果您使用的是 2.7,则只需使用它raw_input而不是输入。

解决方案 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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用