2016-04-20 3 views
1

Я пытаюсь импортировать zip-файл, упакованный с numpy.ошибка импорта python с zip

У меня есть застежка-молния в packages.zip. Однако при использовании zip-файла я получаю следующую ошибку импорта.

> python 
Python 2.7.9 (default, Jan 7 2015, 11:49:12) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.path.insert(0, 'packages.zip') 
>>> import numpy 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "packages.zip/numpy/__init__.py", line 180, in <module> 
    File "packages.zip/numpy/add_newdocs.py", line 13, in <module> 
    File "packages.zip/numpy/lib/__init__.py", line 8, in <module> 
    File "packages.zip/numpy/lib/type_check.py", line 11, in <module> 
    File "packages.zip/numpy/core/__init__.py", line 14, in <module> 
ImportError: cannot import name multiarray 
>>> 

После проверки Numpy/ядро ​​я нашел __init__.py пытается импортировать multiarray.so файл.

Как устранить эту ошибку? Спасибо

+0

Как вы создали .zip-файл? Операционные системы не читают файлы .so' из .zip-файлов, поэтому вы не можете просто зацикливать каталог numpy. У Setuptools есть команда 'bdist_egg', которая обрабатывает библиотеки, создавая файлы stub .py, которые извлекают .so-файлы на диск, где операционная система может их использовать. – tdelaney

+0

'pip install -r requirements.txt --target./Packages' ' cd packages' 'find. -name "* .pyc" -delete' 'find. -name "* .egg-info" | xargs rm -rf' 'zip -9mrv packages.zip' – Vinay

+0

@tdelaney Можете ли вы подробнее рассказать? Мне нужно использовать этот почтовый индекс в среде с уменьшением карты. – Vinay

ответ

0

Операционные системы не распознают файлы .so внутри .zip-файлов. Но «яйца» python могут извлекать модули расширения при импорте, чтобы операционная система могла их видеть и загружать. Подробнее см. Setuptools Extension Import Wrappers.

Я пошел в numpy on pypi и нашел его source on sourceforge. После загрузки и извлечения источника я перешел в исходный каталог и запустил python3 setup.py bdist_egg, и он сгенерировал файл «яйца» (который представляет собой .zip-файл с предопределенной структурой, которую python может использовать при импорте). После изменения в каталог «Dist», код работает:

>>> import sys 
>>> sys.path.insert(0, 'numpy-1.11.0-py3.4-linux-x86_64.egg') 
>>> import numpy 
>>> numpy.__file__ 
'numpy-1.11.0-py3.4-linux-x86_64.egg/numpy/__init__.py' 

Обратите внимание, что «яйцо» от платформы (я использовал питона 3.4 на Linux x86_64), так что вы хотите запустить setup.py на системе, близкой к системы, для которой вы предназначаетесь для развертывания.

«яйцо» - это старый формат упаковки, а «колесо» - новый формат, но у яиц есть преимущество в том, что вы можете запускать модули расширения непосредственно из файла .zip, пока колеса должны быть установлены. На странице Wheel vs Egg:

Колесо - это формат распространения, то есть формат упаковки. [1] Яйцо было как форматом распространения, так и форматом установки времени выполнения (если левая zipped), и была предназначена для импорта.

Если вы не против установки numpy, вы можете использовать один из встроенных колес на PyPI или даже просто pip install numpy, если у вас есть доступ к Интернету. Но если вы хотите запустить из .zip-файла, придерживайтесь яйца.