ValueError:需要多于1个值才能解压缩

时间:2010-12-22 08:49:08

标签: python

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

我正在阅读艰难学习Python,我正在练习13。

以下是我试图在IDLE中运行的代码(不知道它实际上是什么),用于Python 2.7:

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行,in     脚本,第一,第二,第三= 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?

感谢您的支持。

19 个答案:

答案 0 :(得分:3)

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

首先,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?

答案 1 :(得分:2)

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

从终端运行此脚本,如下所示: enter image description here

答案 2 :(得分:2)

将您的代码简化为以下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只包含脚本的路径。

SUGGESTIONS:

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

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

答案 3 :(得分:2)

尝试像“python test.py foo bar baz”

那样调整它

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

答案 4 :(得分:1)

我也在读这本书!第二版Zed.A.Shaw“以艰难的方式学习python”。 我陷入了完全相同的运动! 我花了几天时间才发现为什么我无法运行程序。我用Google搜索了很多,并且很惊讶地看到我不是唯一一个遇到这个问题的人。

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

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

之后我在命令提示符下键入了python D:/abc/ex13.py第一个第二个第三个。(我使用IDLE在D:/ abc中提供的文本编辑器存储了我编码的文件)。但是,它没有用,说没有这样的文件/目录。

很奇怪,我看一下我的文件并注意到根本没有EXTENSION(实际上,文件的类型是“file”)。所以我决定在文件名中添加“.py”,显然,将其更改为python文件。

我再次尝试,在命令提示符下面输入相同的命令行,奇迹刚刚发生,它有效!

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

答案 5 :(得分:1)

这个花了我一些时间来弄清楚,所以让我看看我能不能帮助下一个偶然发现这个页面的人。

如果您的特定错误消息是:&#34; ValueError:需要多于1个值才能解压&#34;到目前为止,你已经能够毫无问题地运行这些示例,你可能正确安装了你的python,你只是不明白 HOW 来运行这个特定的例子,或者< strong>为什么它的工作方式。

如果没有使您尚未学习的内容过于复杂,sys是一个库,而argvsys库的一个功能。可能更容易将sys库看作书,而argv函数就像书中的章节一样。这些图书馆和功能是其他人已经创建的内容,您正在调用&#39;或者&#39; 导入&#39;他们进入你的程序。这样可以节省您自己重写它们的时间。第一行基本上说: 在sys一书中,使用章节argv

from sys import argv

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

  • 我想购买多少件物品?
  • 这些物品是什么?

当您第一次导入argv时,它基本上就像一张白纸,没有相关信息。您可以通过在命令行中直接从python运行以下命令来测试它。 (打开命令提示符或PowerShell&amp;键入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!

希望这有帮助!

答案 6 :(得分:1)

我发现对上述方向做了一个简单的调整,解决了整个问题: 1.打开命令提示符 2.键入:set path=%path%;C:\python26(&lt; - 我正在使用2.6.5,相应地进行编辑) 3.输入:python C:/Users/research/Desktop/example.py first second third

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

答案 7 :(得分:1)

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

您正在使用python软件运行代码。

你要做的就是去所有节目&gt;配件&gt;命令提示符

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

如果,当您只是单击“python”并点击返回时,您会收到“未定义的消息”,您需要遵循这些http://docs.python.org/using/windows.html 将python重置为可执行文件“path”

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

答案 8 :(得分:1)

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

python ex14.py (your name)

答案 9 :(得分:1)

阅读更远。第36页学习Python艰难之路,1.0版说

你应该看到什么

运行如下程序:

python ex13.py第2个第3个

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

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

该脚本名为:ex1.py

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

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

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

[rick @ redhat~] $

答案 10 :(得分:1)

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)测试缺少参数的数量,也可以按照学习Python的方法提供它们:

  

运行如下程序:

python ex13.py first 2nd 3rd

答案 11 :(得分:0)

Windows&lt;开始&lt;运行&lt; CMD(输入)

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

然后简单地键入,python argv.py第2个第3个

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

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

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

是否有一个更好的教程,因为学习Python的艰难之路的作者不鼓励我认为对业务不利的python 3.x.

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

答案 12 :(得分:0)

练习13有效。我花了两天时间弄明白,但确实如此。这是诀窍 1.你需要从命令提示符运行它(Windows,我认为它在OSX中称为终端),而不是python。 2.启动命令提示符但不要运行python。这意味着您不应该看到“Python 2.x.x ....输入'帮助','版权','信用'消息。如果您是,请输入quit()并按Enter键。

  1. 您需要位于脚本所在的目录中。如果没有,你将得到[Errno 2]没有这样的文件或目录错误。

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

  3. cd C:\ Python27 \ Mystuff

    1. 进入正确的目录后,我输入以下内容来运行脚本。
    2. python myscript.py第一个第二个第三个

      1. 正确完成后,在我按Enter键运行脚本之前,我的行看起来像这样:
      2. C:\ Python27 \ Mystuff&gt; python myscript.py第一个第二个第三个

        OMG它有效。我还是很震惊。我很开心。祝你好运!

答案 13 :(得分:0)

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

py -2 ex13c.py B C D

有关详细信息,请参阅官方文档中的Python Windows Launcher

答案 14 :(得分:0)

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

**

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

**

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

跟着它

答案 15 :(得分:0)

如果您没有将Python作为Windows路径中的环境变量,您可以运行如下代码:

  1. 打开命令提示符
  2. 输入如下代码:

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

  3. 瞧!

答案 16 :(得分:0)

在Windows shell中,键入:

python ex13.py first second third

答案 17 :(得分:0)

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

$ python ex13.py第一个第二个第三个&lt; ===========在命令提示符下输入这一行并且可以正常工作

脚本名为:ex13.py
你的第一个变量是:第一个 你的第二个变量是:第二个 你的第三个变量是:第三个

对ex14做同样的事情,你会发现它会起作用。

答案 18 :(得分:0)

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

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

然后做:

python ex13.py first 2nd 3rd