我设法无需安装即可使用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'
>>>
答案 0 :(得分:1)
(这是建议的操作方式,可以回答您的问题:“正确使用zipimport
的方式;”请参见下文进一步了解错误的直接原因。) >
您不应直接使用zipimport
。相反,您应该将.zip
文件添加到sys.path
中-它将像使用目录一样使用。
也就是说,您下载的文件是一个源分发文件-它的根目录为setup.py
,实际模块位于子目录中。要使用该模块,您需要使用a built distribution。
有关源和内部发行版的所有讨论都超出了单个答案的范围。一种可行的方法是:
.zip
setup.py
和python setup.py bdist_wheel
和pip install <path to .whl>
使用Visual Studio进行调试显示,这是它阻塞的代码:
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>
>>>