【问题标题】:input() error - NameError: name '...' is not definedinput() 错误 - NameError: name \'...\' is not defined
【发布时间】:2022-11-27 06:19:43
【问题描述】:

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

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 启动器的首选项对话框。显然它不会默认运行与它一起安装的版本,这是......愚蠢的。 (我自己从未使用过它;我发现使用终端更好……)

标签: python python-2.7 input nameerror


【解决方案1】:

长话短说

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

              我们正在使用以下两者都有效的方法蟒蛇 2 和蟒蛇 3

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

              【讨论】:

                【解决方案9】:

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

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

                  1. 如果你想输入string,那么只要开始输入“input goes with double-quote”,它就可以在python2.7和
                  2. 如果您想输入字符,请使用带有单引号的输入,例如“您的输入在这里”
                  3. 如果您想输入数字不是问题,您只需输入数字
                  4. 第二种方法是更改​​代码
                    使用以下导入并与任何版本的 python 一起运行

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

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

                关于这些方法的事实:
                input() 函数:此函数按原样获取您输入的值和类型,而不修改其类型。
                raw_input() 函数:这个函数显式地将你给的输入转换成字符串类型,

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

                【讨论】:

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

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

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

                  【讨论】:

                    【解决方案12】:

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

                    要确定您的文件是否可执行:

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

                    如果您按照凯文的建议包含了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: "))
                      
                      输入您的姓名:乔
                      ('Gi', 'Joe', &lt type 'str &gt)
                      基乔,通过
                      你的名字:乔
                      乔

                      谢谢!

                      【讨论】:

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

                          【讨论】:

                          • 如果您需要支持 Python 2 和 Python 3,您应该使用 six 库,它提供了 six.input。如果您使用的是 Python 3,则没有理由每次调用 input_compatible 时都捕获 NameError
                          • 有时您不想依赖任何非标准包,例如在编写可移植的 shell 脚本时,所以这个答案有它的位置和理由。
                          • 这仍然不能成为每次尝试调用该函数时都使用 try 语句的借口。 raw_input 不会在您的脚本执行时突然出现;它要么在开始时可用,要么根本不可用。此外,如果您需要两个版本之间的兼容性,则可能有很多你需要容纳的东西,不使用 six 是没有意义的。
                          • 请原谅@chepner,但我不同意你的看法。首先,您没有为需要便携式解决方案且无法使用的用例提供更好的替代方案任何非标包。既然你还没有,我编辑了我的答案以包括这样的内容。其次,虽然我通常同意你不应该使用 try 块来处理你可以轻松提前检查的情况,但在这种情况下,它没有任何性能下降,而且在我看来看起来比替代方案更干净。
                          • 并非每个问题都可以或应该单独使用标准库来解决。
                          猜你喜欢
                          • 2020-11-07
                          • 1970-01-01
                          • 2022-12-02
                          • 1970-01-01
                          相关资源
                          最近更新 更多