带zip的python导入错误

时间:2016-04-20 22:18:56

标签: python numpy zip

我正在尝试导入一个用numpy打包的zip文件。

我已将numpy压缩到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 / core后,我发现__init__.py正在尝试导入multiarray.so文件。

如何解决此错误?感谢

1 个答案:

答案 0 :(得分:0)

操作系统无法识别.zip文件中的.so文件。但是python“eggs”可以在导入时提取扩展模块,以便操作系统可以查看和加载它们。有关详细信息,请参阅setuptools Extension Import Wrappers

我前往numpy on pypi找到了source on sourceforge。下载并解压缩源代码后,我切换到源目录并运行python3 setup.py bdist_egg并生成一个“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'

请注意,“egg”是特定于平台的(我在linux x86_64上使用了python 3.4),因此您希望在靠近您要部署的系统的系统上运行setup.py

“egg”是旧包格式,“wheel”是新格式,但egg的优点是,您可以直接从.zip文件运行扩展模块,同时需要安装轮子。来自Wheel vs Egg页面:

  

Wheel是一种分发格式,即包装格式。 [1] Egg既是分发格式又是运行时安装格式(如果保留拉链),并且设计为可导入。

如果你不介意安装numpy,你可以使用pypi上的一个预建轮子,如果你有权访问互联网,你可以使用pip install numpy。但是如果你想从.zip文件运行,请坚持使用鸡蛋。