【问题标题】:ValueError: need more than 1 value to unpackValueError:需要超过 1 个值才能解压
【发布时间】:2011-05-29 07:05:34
【问题描述】:

免责声明:我已阅读位于 Python Error: "ValueError: need more than 1 value to unpack" 的线程,但没有一个答案解释了如何实际运行代码。

我正在阅读 Learn Python the Hard Way,我正在练习第 13 题。

这是我试图在 Python 2.7 的 IDLE 事物(不知道它的真正名称)中运行的代码:

from sys import argv

script, first, second, third = argv

print "The script is called:", script
print "Your first variable is:", first
print "Your second variable is:", second
print "Your third variable is:", third

运行时出现错误:

"Traceback(最近一次调用最后一次): 文件“C:\Python\LPTHW\examples_LPTHW\ex13.py”,第 3 行,在 脚本,第一,第二,第三 = argv ValueError: 需要超过 1 个值才能解压"

我尝试通过 Windows 命令提示符运行程序,但无济于事。我还通过在 IDLE 和命令提示符下键入:“python ex13.py first 2nd 3rd”来运行程序,也得到了同样的错误。

我如何让这段代码运行,我到底做错了什么?

编辑:@John Machin,我制作了一个与您发布的完全一样的程序,将其保存为 .py,然后进入保存我的文件的正确目录,使用“python yourcode.py BCD”运行该程序我收到以下消息“python 未被识别为内部或外部命令......”当我通过输入它的名称运行程序时(适用于除此之外的所有其他程序)我收到一条错误消息“SyntaxError:第 2 行的语法无效:print len(argv), repr(argv)"。

编辑 2(使用新代码):@John Machin,我将您的程序逐字复制到 gedit 并照常制作 .py 文件。我打开终端(命令提示符)并输入:

python ex13c.py B C D

并收到:

'python' is not recognized as an internal or external command, operable program or batch file."

然后我输入:

ex13c.py

并收到:

3.1.3 (r313:86834, Nov 27 2010, 18:30:53) [MSC v.1500 32 bit (Intel)]
1 ['C:\\Python\\LPTHW\\examples_LPTHW\\ex13c.py']
Traceback (most recent call last):
  File "C:\Python\LPTHW\examples_LPTHW\ex13c.py". line 4, in (module)
    a, b, c, d = argv
ValueError: need more than 1 value to unpack

请记住,我正在运行 W7 64 位,并且 Zed 正在使用 2.X 进行教学,并且到目前为止我一直在使用 2.7 整本书。其他所有示例都有效。就在我开始示例 11 之前,我为即将开始阅读的另一本书安装了 3.1。每次我使用 2.7 附带的 IDLE。也许我在尝试在 2.7 中编码时不经意间使用了 3.1?

感谢您对我的包容。

【问题讨论】:

  • 如果您在该行之前打印 argv,输出是什么?
  • 在哪一行之前打印 argv?咆哮:我不明白为什么这个程序不起作用。我正在做所有用 LPTHW 编写的东西。
  • 打印 argv 在哪里?看我的回答。
  • 因此您必须运行 Python 3.X(一旦您解决了“解包”问题,原始代码中的打印语句也会遇到同样的问题。请参阅我编辑的答案。

标签: python


【解决方案1】:

该示例有效。好像你没有正确运行它。

首先,IDLE 是一个有点特殊的环境,我从来没有看到它的意义,只需使用普通的 Python 解释器运行它。

其次,指定 python 解释器的完整路径。而不是

 python ex13c.py B C D

您在 Windows 上需要执行以下操作:

 "C:\Program Filed\Python-2.7.1\Python.exe" ex13c.py B C D

阅读练习 13 我还看到 Zed 直到第 13 章都将模块称为“功能”。这样做没有意义,这只是令人困惑。他还在某些章节中告诉人们要记住逻辑表的输出,这是无稽之谈。你不需要记住它们,你需要理解它们。

每次这本书在这里出现问题时,我都会对它印象不深。我相信一定有更好的教程。也许潜入 Python?

【讨论】:

    【解决方案2】:

    尝试像“python test.py foo bar baz”一样调整它

    如果它像那样工作,但如果你在没有指定解释器的情况下调用它会失败,请看这里:http://bugs.python.org/issue7936

    【讨论】:

      【解决方案3】:

      将您的代码简化为以下 4 行:

      from sys import argv
      print len(argv), repr(argv)
      a, b, c, d = argv
      print a, b, c, d
      

      并在命令提示符窗口中键入

      运行它
      python yourcode.py B C D
      

      然后复制/粘贴确切的结果到您的问题的编辑中。确保显示带有任何语法错误的 ^。同时显示您运行的确切代码:type yourcode.py

      编辑改用这个:

      from sys import argv, version
      print(version)
      print(len(argv), repr(argv))
      a, b, c, d = argv
      print(a, b, c, d)
      

      编辑 2

      第一次试用:你做了:python ex13c.py B C D,但一无所获。 现在试试:c:\PYTHON\python ex13c.py B C D (我从之前的证据中假设某些版本的 Python 所在的位置)

      第二次试验:你做了:ex13c.py 没有参数(为什么?)结果是:(1).py 似乎与某处的 3.1.3 Python 可执行文件相关联,因为它是最后安装的版本 (2) 因为您没有提供任何参数,所以 len(argv) 为 1,而 argv 仅包含脚本的路径。

      建议:

      您希望在同一台机器上安装 2.7 和 3.1。这是很有可能的(我有 3.1 和 2.1 到 2.7,因为我支持在这些版本上运行的软件,而 1.5.2 则用于怀旧),只需稍加注意。您需要做的主要事情是 (1) 在目录 c:\pythonXY 中安装 Python XY (2) 从命令行运行脚本,如下所示:\python27\python myscript.py arg1 arg2 etc (3) 不要(就像您目前所做的那样) 将您自己的脚本和数据放在 c:\Python31 等软件目录中。

      所以: A. 为“book1”和“book2”设置新的脚本和数据目录。将所有现有代码和数据复制到这些新目录。进行备份。 B. 卸载所有版本的 Python C. 将 2.7 和 3.1 安装到各自的目录。 D. 检查您是否可以从新位置运行脚本。

      【讨论】:

      • 似乎 OP 的问题是他不知道如何从终端运行任何东西。又一个 GUI 人。
      【解决方案4】:
      from sys import argv
      a, b, c, d = argv
      print "The script is called:", a
      print "Your first variable is:", b
      print "Your second variable is:", c
      print "Your third variable is:", d
      

      将此脚本另存为:s.py

      从终端运行此脚本,如下所示:

      【讨论】:

        【解决方案5】:

        Argv 是命令行参数,它缺少值(只有一个,脚本名称)。如果你想让None 缺失值,你可以试试:

        from sys import argv
        
        argv.extend([None, None, None])
        script, first, second, third = argv
        
        print "The script is called:", script
        print "Your first variable is:", first
        print "Your second variable is:", second
        print "Your third variable is:", third
        

        您还可以使用 len(argv) 测试缺失参数的数量,还可以按照 Learn Python The Hard Way 中的建议提供它们:

        像这样运行程序:

        python ex13.py first 2nd 3rd
        

        【讨论】:

        • 输入该代码时出现此错误:“Traceback(最近一次调用最后一次):文件“C:\Python\LPTHW\examples_LPTHW\ex13a.py”,第 4 行,在 脚本中, first, second, third = argv ValueError: need more than 2 values to unpack"
        • 哎呀,我的错,我输入了追加而不是扩展,我会立即更正
        • 在哪里输入“python ex13.py first 2nd 3rd”让程序运行?我已经在 IDLE 和命令提示符下完成了,都给了我同样的错误。我完全按照 Zed 的例子逐字逐句,所以我不明白为什么它会给我带来这么多麻烦。他说我需要在“终端”中运行它。那是什么?
        • “终端”是 Mac-ese 的“命令提示符”。在 Windows 上,您在命令提示符下键入它 - 不是 Python REPL 提示符,而是 cmd.exe 窗口提示符。它真的应该为你工作。
        • 如果您有某种 IDE(能够运行程序的文本编辑器),可能有一些菜单会打开一个对话框,您可以在其中输入命令行参数。 “终端”的东西用于在交互式 python 提示符之前启动 python。如果你在交互式 python 提示符下,那就太晚了。
        【解决方案6】:

        读得更远。 Learn Python The Hard Way 第 36 页,1.0 版说

        你应该看到什么

        像这样运行程序:

        python ex13.py 一二三

        ARGV 从命令行获取。像上面一样运行它并输入三个变量。该脚本将获取脚本的名称,然后添加您的三个参数。

        [rick@redhat ~]$ python ex1.py 1st 2nd 3rd

        脚本调用:ex1.py

        你的第一个变量是:第一个

        你的第二个变量是:2nd

        你的第三个变量是:3rd

        [rick@redhat ~]$

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题,在注册表中尝试了各种愚蠢的东西,你也有什么。原来我只是在运行脚本的实际命令,如上所述。它要求您在运行它时必须输入的值。当你到达ex14.py 时,它会给出同样的错误,除非你使用:

          python ex14.py (your name)
          

          【讨论】:

            【解决方案8】:

            我发现对上述说明进行简单调整可以解决整个问题: 1.打开命令提示符 2. 输入:set path=%path%;C:\python26(python C:/Users/research/Desktop/example.py first second third

            对我来说,该过程仅在输入完整文件名时才有效,而不仅仅是输入 example.pyex13.py,无论是什么-。 祝你好运!

            【讨论】:

              【解决方案9】:

              这发生在我身上。 非常简单的修复

              您正在从 python 软件中运行您的代码。

              你要做的就是去所有程序>附件>命令提示符

              当命令提示符窗口打开时,您只需键入“python ex13.py first second third”

              如果,当您自己键入“python”并按回车键时,您会收到“未定义消息”,您需要遵循这些http://docs.python.org/using/windows.html 将 python 重置为可执行的“路径”

              我不知道“路径”是什么意思,基本上它只是在你输入“python”时指导计算机去哪里

              【讨论】:

                【解决方案10】:

                我也在读同一本书! Zed.A.Shaw 的“Learn python the hard way”,第二版。 我坚持完全相同的练习! 我花了好几天的时间才弄清楚为什么我不能让程序运行。我用谷歌搜索了很多,很惊讶地发现我不是唯一一个遇到这个问题的人。

                但现在我知道如何修复它并且它现在可以工作......就像一个魅力

                首先,我阅读了 Kriss 对“终端是什么?”的回答。 (实际上,我也不知道那是什么。我一直在文本编辑器中对 LPTHD 中的所有内容进行编码——可以通过在“IDLE(pythonGUI)”中选择 File --> New --> New Window 来运行)然后我发现(感谢 Kriss)终端应该是原始命令提示符(而不是在你运行 python 之后)

                之后,我在命令提示符下输入了 python D:/abc/ex13.py 1st second third.(我将使用 IDLE 提供的文本编辑器编码的文件存储在 D:/abc 中)。但是,它不起作用,说没有这样的文件/目录。

                很好奇,我查看了我的文件,发现根本没有 EXTENSION(实际上,文件的类型是“文件”)。所以我决定在文件名中添加“.py”,并且显然将其更改为 python 文件。

                我又试了一次,在命令提示符下键入上面相同的命令行,奇迹就发生了,它成功了!!!

                我不知道你们中的任何人是否需要这个,或者这可能是你的答案,但由于我在这个问题上经历了如此艰难的时期,几乎让我决定改变这本书(因为LPTHD 的后面章节是基于这个),我决定在这里发布它,希望它可以帮助某人。

                【讨论】:

                  【解决方案11】:

                  这个问题我也花了一些时间才弄清楚,所以让我看看我是否无法帮助下一个偶然发现此页面的人。

                  如果您的具体错误消息是:“ValueError: need more than 1 value to unpack”,并且到目前为止您已经能够顺利运行示例,那么您可能正确安装了 python,您只是没有了解如何运行这个特定的示例,或为什么它的工作方式。

                  不要过度复杂化您尚未学习的内容,sys 是一个库,argvsys 库的一个函数。可能更容易将sys 库想象成一本书,而将argv 函数想象成书中的一章。这些库和函数是其他人已经创建的东西,您正在“调用”或“导入”它们到您的程序中。这样可以节省您自己重写它们的时间。第一行基本上说: 来自sys 本书,使用章节argv

                  from sys import argv
                  

                  在我们继续之前,我们需要了解argv 函数是什么。稍后您将了解数组是什么,但现在将argv 视为购物清单。一个购物清单可以有 1 项或 20 项,具体取决于您的需要,但在使用它之前,您必须决定两件事:

                  • 我要购买多少商品?
                  • 那些物品是什么?

                  当您第一次导入argv 时,它基本上就像一张白纸,上面没有任何信息。您可以通过直接在命令行中从 python 运行以下命令来测试它。 (打开命令提示符或PowerShell并输入python。然后输入以下2行)

                  >>> from sys import argv 
                  >>> print argv
                  

                  结果是一个空数组,或者在我们的示例中是一个购物清单。

                  ['']
                  

                  要开始赋值,我们将采用完全相同的两行代码,但不是在 python 中输入它们,而是将它们保存为 .py 文件(我将我的保存为 ex_13.py)。然后,我们将从命令行运行此代码,就像我们拥有所有其他示例一样。 注意如果你还在 python 里面输入:exit() 返回命令行

                  现在,当我们使用以下命令运行程序时:

                  python ex_13.py 
                  

                  结果是:

                  ['ex_13.py']
                  

                  如您所见,argv 函数不再为空,而是包含您的文件名!但是,它从哪里获得了这个价值?以及我们如何分配其中一个以上?

                  当我们编写 ex_13.py 文件时,我们导入的 argv 函数期望至少有一个值分配给它。为了分配该值,我们然后运行 ​​ex_13.py,该函数使用我们输入的文件名并将其分配给第一个值。要将更多项目添加到我们的列表中,我们只需继续这两个单独的步骤!我们可以通过像这样修改 ex_13.py 来展示这一点:

                  from sys import argv
                  a, b = argv # Here we tell argv to expect 2 values to be passed to it.
                  print argv
                  

                  现在。如果您尝试使用以下命令从命令行运行此脚本:

                  python ex_13.py
                  

                  您可能收到以下错误消息:

                  ValueError: need more than 1 value to unpack
                  

                  原因是因为我们在文件的文本中指定了我们想要两个参数(值/项目),但是当我们运行它时,我们只提供了一个。要成功执行此脚本,请尝试输入以下内容:

                  python ex_13.py Peaches!
                  

                  这一次,结果是一个数组,同时传递了两个参数。

                  ['ex_13.py','Peaches!']
                  

                  现在,当我们回到最初的课程时,更容易理解我们在做什么以及如何让程序无错误地执行。将你的 ex_13.py 更新为如下所示:

                  from sys import argv
                  string_a, string_b, string_c, string_d = argv
                  
                  print "The name of your file is held in string_a:", string_a
                  print "The next word you type in is stored in string_b:", string_b
                  print "The word after that is stored in string_c:", string_c
                  print "And the last one is stored in string_d:", string_d
                  

                  现在,通过在命令行中键入以下内容来运行脚本:

                  python ex_13.py peaches are delicious!
                  

                  你的输出应该是:

                  The name of your file is held in string_a: ex_13.py
                  The next word you type in is stored in string_b: peaches
                  The word after that is stored in string_c:, are
                  And the last one is stored in string_d:, amazing!
                  

                  希望这会有所帮助!

                  【讨论】:

                    【解决方案12】:

                    Windows

                    转到包含 argv py 文件的目录,我的是 C:\Python33\Python Lessons\Lesson 1\argv.py

                    然后只需键入,python argv.py first 2nd 3rd

                    您应该会在命令 shell 窗口中看到输出

                    Linux,使用 bash shell,MaxOS 使用终端窗口。

                    argv 是通过命令行传递参数的,这就是每个人在这里所说的,我只是附和他们的观点。

                    有没有更好的教程,因为 Learning Python the Hard Way 的作者不鼓励我认为对业务不利的 python 3.x。

                    大声笑,当被问及使用 Python 3.x 并在 10 年后回复时,他甚至告诉人们 NO!

                    【讨论】:

                      【解决方案13】:

                      练习 13 作品。我花了两天时间才弄清楚,但确实如此。这是诀窍 1.您需要从命令提示符(Windows,我认为它在 OSX 中称为终端)而不是 python 运行它。 2. 启动命令提示符但不要运行 python。这意味着您不应该看到“Python 2.x.x....键入 'help', 'copyright', 'credits' 消息。如果是,请输入 quit() 并按 Enter。

                      1. 您需要位于脚本所在的目录中。如果没有,您将收到 [Errno 2] No such file or directory 错误。

                      2. 对于我来说,我将 myscript.py 保存在 C:\Python27\MyStuff\ 文件夹中。所以在命令提示符下,我必须输入以下内容以确保我在 MyStuff 目录中:

                      cd C:\Python27\Mystuff

                      1. 进入正确的目录后,我键入以下内容来运行脚本。

                      python myscript.py 第一个 第二个 第三个

                      1. 正确完成后,在按 Enter 运行脚本之前,我的行如下所示:

                      C:\Python27\Mystuff>python myscript.py 第一个第二个第三个

                      天哪,它奏效了。我还在震惊中。我很开心。祝你好运!

                      【讨论】:

                        【解决方案14】:

                        如果您在 Windows 机器上运行多个版本的 Python,您应该继续安装 Python 3.3。这是因为它带有py.exe,它允许您将python版本指定为参数:

                        py -2 ex13c.py B C D
                        

                        更多信息请参阅官方文档中的Python Windows Launcher

                        【讨论】:

                          【解决方案15】:
                          from sys import argv
                          script,first,second,chya,dog=argv
                          print"Script is",script
                          print "first ",first
                          print "Second",second
                          print "third",chya
                          print "Four",dog
                          

                          **

                          并使用您的参数编译您的代码,然后它将显示正确的答案。因为它只需要两个参数“脚本和用户名”来添加更多参数,你必须在编译后编译这些参数

                          **

                          $ python basic_input1.py first second chya dog
                          Script is basic_input1.py
                          first  first
                          Second second
                          third chya
                          Four dog
                          

                          关注它

                          【讨论】:

                            【解决方案16】:

                            如果你在 windows 路径中没有 Python 作为环境变量,你可以像这样运行代码:

                            1. 打开命令提示符
                            2. 这样输入代码:

                              "C:\Your Path to the Python.exe" D:\Your full path to the python file.py第一第二第三

                            3. 瞧!

                            【讨论】:

                              【解决方案17】:

                              在 windows shell 中,输入:

                              python ex13.py first second third
                              

                              【讨论】:

                                【解决方案18】:

                                好吧,我在 ex13 和 ex14 上遇到了同样的问题,但经过长时间的搜索,我发现我在执行代码时突然看到 Zed 的输出后输入了错误的命令。

                                $ python ex13.py first 2nd 3rd

                                脚本调用:ex13.py
                                您的第一个变量是:first
                                你的第二个变量是:2nd
                                您的第三个变量是:3rd

                                对 ex14 做同样的事情,你会看到它开始工作了。

                                【讨论】:

                                  【解决方案19】:

                                  如果您是 Window 的用户,“终端”也称为“Windows Powershell”。

                                  打开 Windows Powershell 并首先使用 cd C:\Users\... 将您的目录更改为您保存 ex13.py 文件的位置(确保将其保存为 .py 而不是 .ipynb,它是一个 IPython 笔记本) .

                                  然后做:

                                  python ex13.py first 2nd 3rd
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2018-05-20
                                    相关资源
                                    最近更新 更多