【问题标题】:python import error with zipzip 的 python 导入错误
【发布时间】:2016-04-21 08:38:12
【问题描述】:

我正在尝试导入一个用 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 文件。

我该如何解决这个错误?谢谢

【问题讨论】:

  • 您是如何构建 .zip 文件的?操作系统不会从 .zip 文件中读取 .so 文件,因此您不能只压缩 numpy 目录。 Setuptools 有一个 bdist_egg 命令,它通过生成存根 .py 文件来处理库,这些 .py 文件将 .so 文件提取到操作系统可以使用它们的磁盘。
  • pip install -r requirements.txt --target ./packages cd packages find . -name "*.pyc" -delete find . -name "*.egg-info" | xargs rm -rf zip -9mrv packages.zip
  • @tdelaney 你能详细说明一下吗?我需要在 map-reduce 环境中使用这个 zip。

标签: python numpy zip


【解决方案1】:

操作系统无法识别 .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”是新的格式,但是eggs的优点是你可以直接从.zip文件运行扩展模块,而需要安装wheels。来自Wheel vs Egg 页面:

Wheel 是一种分发格式,即一种打包格式。 [1] Egg 既是一种分发格式,也是一种运行时安装格式(如果是压缩的),并且被设计为可导入的。

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

【讨论】:

    猜你喜欢
    • 2023-02-07
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2015-09-20
    相关资源
    最近更新 更多