使用zipimport的正确方法;看似有效的文件上的“ zipimport.ZipImportError:不是Zip文件”

时间:2018-08-13 10:42:24

标签: python

我设法无需安装即可使用this module-只需从使用路径导入,

import sys 
url = 'https://example.com' 
sys.path.insert(0, r'C:\Users\i\Downloads\you-get-0.4.1128\src')  # 
from you_get import common 
common.any_download(url, info_only=True)#NoneType 

在Python中似乎可以使用zipimport直接使用模块的zip存档而不进行提取,我想知道使用zipimport的正确方法是什么,像下面这样的简单尝试就给出了例外。我从here下载了文件,文件C:\Users\i\Downloads\you-get-0.4.1128.zip确实存在并且没有损坏。

>>> import zipimport 
>>> zipimport.zipimporter(r'C:\Users\i\Downloads\you-get-0.4.1128.zip') 
Traceback (most recent call last): 
  File "<pyshell#1>", line 1, in <module> 
    zipimport.zipimporter(r'C:\Users\i\Downloads\you-get-0.4.1128.zip') 
zipimport.ZipImportError: not a Zip file: 'C:\\Users\\i\\Downloads\\you-get-0.4.1128.zip' 
>>> 

2 个答案:

答案 0 :(得分:1)

(这是建议的操作方式,可以回答您的问题:“正确使用zipimport的方式;”请参见下文进一步了解错误的直接原因。)

您不应直接使用zipimport。相反,您应该将.zip文件添加到sys.path中-它将像使用目录一样使用。

也就是说,您下载的文件是一个源分发文件-它的根目录为setup.py,实际模块位于子目录中。要使用该模块,您需要使用a built distribution

有关源和内部发行版的所有讨论都超出了单个答案的范围。一种可行的方法是:

  • 打开.zip
  • 的包装
  • 使用setup.pypython setup.py bdist_wheel
  • 使用pip install <path to .whl>
  • 安装

使用Visual Studio进行调试显示,这是它阻塞的代码:

v3.6.5,Modules\zipimport.c

if (fseek(fp, -22, SEEK_END) == -1) {
    <...>
}
header_position = (unsigned long)ftell(fp);
<...>
if (fread(buffer, 1, 22, fp) != 22) {
    <...>
}
if (get_uint32(buffer) != 0x06054B50u) {
    /* Bad: End of Central Dir signature */
    errmsg = "not a Zip file";
    goto invalid_header;
}

如您所见,它将读取并验证文件的最后22个字节为"end of central dir signature"

规范说:

  

4.3.1 ZIP文件必须包含“中央目录记录的结尾”。

     

<...>

     

4.3.6 .ZIP总体文件格式:

<...>
[end of central directory record]
     

4.3.16中央目录记录的结尾:

  end of central dir signature    4 bytes  (0x06054b50)
  number of this disk             2 bytes
  number of the disk with the
  start of the central directory  2 bytes
  total number of entries in the
  central directory on this disk  2 bytes
  total number of entries in
  the central directory           2 bytes
  size of the central directory   4 bytes
  offset of start of central
  directory with respect to
  the starting disk number        4 bytes
  .ZIP file comment length        2 bytes
  .ZIP file comment       (variable size)

如您所见,此“中央目录记录的末尾”为22个字节。。不带注释。这个文件确实有一个注释:

$ xxd -s 0x322b5 -g 1 you-get-0.4.1128.zip
000322b5: 50 4b 05 06 00 00 00 00 af 00 af 00 25 45 00 00  PK..........%E..
000322c5: 90 dd 02 00 28 00 61 30 62 39 37 65 35 36 65 35  ....(.a0b97e56e5
000322d5: 36 35 38 36 33 35 62 35 63 35 66 32 66 33 32 65  658635b5c5f2f32e
000322e5: 38 62 38 63 31 34 62 64 33 35 61 65 62 33        8b8c14bd35aeb3

所以这是一个错误。 Here's a relevant ticket.

答案 1 :(得分:0)

我已经下载了文件,但有同样的例外,尽管文件似乎合法。

也许您应该改用zipfile

>>> import zipfile
>>> zipfile.ZipFile( 'you-get-0.4.1128.zip' )
<zipfile.ZipFile object at 0x7fc515343c50>
>>>