Правильный способ использования zipimport; & ldquo; zipimport.ZipImportError: не Zip-файл & rdquo; по видимому действительному файлу

Мне удалось использовать этот модуль без установки - просто импортируйте его из пути для использования,

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, простая попытка, подобная приведенной ниже, дает только исключение. Я загрузил файл из этого модуля , файл 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 "", line 1, in  
    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
задан 13 August 2018 в 15:22

2 ответа

(Это предложенный способ действия, который отвечает на ваш вопрос: «Правильный способ использования zipimport», см. ниже ниже для непосредственной причины вашей ошибки.)

Вы не должны используйте zipimport напрямую. Вместо этого вы должны добавить файл .zip в sys.path - он будет использоваться, как если бы он был каталогом.

При этом файл, который вы загрузили, является исходным дистрибутивом - он имеет setup.py в корневом каталоге и фактические модули в подкаталоге. Чтобы использовать модуль, вам обычно нужен встроенный дистрибутив.

Рассказывать все об источниках и встроенных дистрибутивах выходит за рамки одного ответа. Один из возможных способов:

распаковать .zip сделать колесо с помощью setup.py с python setup.py bdist_wheel и установить его с помощью pip install <path to .whl>

Отладка с помощью Visual Studio показывает, что zipimport проверяет файл с на встроенный дистрибутив , который включает в себя расширения ZIP64, к которым этот файл не соответствует.

это код, который он зажимает:

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 байта файла как Расширения ZIP64 - этого файла нет.

1
ответ дан 15 August 2018 в 17:04
  • 1
    Благодаря вашему объяснению я извлекаю zip-архив, а затем добавляю извлеченный в zip-архив с помощью Bandizip, на этот раз zipimport.zipimporter(r'C:\Users\i\Downloads\you-get-0.4.1128.zip') не дает исключения, но все равно не может импортировать модуль, даже добавив файл .zip в sys.path, проверенный код здесь bpaste.net/show/243292a2d4a6 – iMath 14 August 2018 в 10:15
  • 2
    @iMath См. текст после «Это сказано ...» . Вам нужно либо сделать встроенный дистрибутив из этого архива, либо загрузить и установить .whl с того же сайта. Если у вас нет особых потребностей, это стандартный подход к сторонним пакетам. – ivan_pozdeev 14 August 2018 в 10:21
  • 3
    То, что я на самом деле хочу сделать, - это использовать модуль из замороженного приложения pyinstaller, мне также необходимо обновить модуль до последней версии, когда это необходимо, я пока не могу найти решение. – iMath 14 August 2018 в 10:22
  • 4
    @iMath Задайте отдельный вопрос об этом, точно и подробно описывая сценарии использования (= что у вас есть и чего вы пытаетесь достичь). Информации, которую вы дали, недостаточно, чтобы получить полную картину, и это звучит как достаточно большой вопрос для еще одного полного вопроса и ответа. Наконец, это совершенно отдельный вопрос (организация ваших модулей для сценария использования) из того, что вы здесь задали (проблема с импортом из определенного .zip-файла), и SO является одним из вопросов, связанных с вопросом, чтобы оставаться полезным для будущих читателей. – ivan_pozdeev 14 August 2018 в 10:36
  • 5
    @iMath, который сказал, stackoverflow.com/questions/5366100/… выглядит релевантно из предоставленной вами информации. – ivan_pozdeev 14 August 2018 в 10:41

Я загрузил файл и получил то же исключение, хотя файл кажется законным.

Возможно, вы должны использовать zipfile вместо:

>>> import zipfile
>>> zipfile.ZipFile( 'you-get-0.4.1128.zip' )
<zipfile.ZipFile object at 0x7fc515343c50>
>>>
0
ответ дан 15 August 2018 в 17:04

Другие вопросы по тегам:

Похожие вопросы: