【问题标题】:How does one install/fix a failed numpy installation that works on python 3.4 but not in 3.5?如何安装/修复适用于 python 3.4 但不适用于 3.5 的失败 numpy 安装?
【发布时间】:2017-06-26 15:11:07
【问题描述】:

我试图在 ubuntu 中使用 numpy,但失败并出现错误:

导入多数组 numpy 扩展模块失败。最有可能的 您正在尝试导入失败的 numpy 构建。如果你在工作 使用 numpy git repo,尝试git clean -xdf(删除所有文件不 在版本控制下)。否则重新安装 numpy。

问题是我使用的是 python 3.5(我使用this question 中的建议安装)而不是默认的 3.4。所以我按照那个答案的建议安装了它,然后我安装了 numpy:

pip3 install --target=/usr/local/lib/python3.5/dist-packages numpy

以便它安装到 python3.5。之后,如果我尝试使用 numpy,则会出现上述错误。但是,如果我在默认的 python 3.4 上使用它,我没有那个错误。我显然试图重新安装/更新/修复 numpy,但它没有做任何事情。具体来说,我做了:

pip install --target=/usr/local/lib/python3.5/dist-packages --upgrade numpy

有没有办法在 ubuntu 中使用 python 3.5 时安装 numpy?我该如何修复numpy?为什么我的 numpy 适用于 3.4 而不适用于 3.5?


完整的错误是:

>>> import numpy
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/numpy/core/__init__.py", line 16, in <module>
    from . import multiarray
ImportError: cannot import name 'multiarray'

During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.5/dist-packages/numpy/__init__.py", line 142, in <module>
        from . import add_newdocs
      File "/usr/local/lib/python3.5/dist-packages/numpy/add_newdocs.py", line 13, in <module>
        from numpy.lib import add_newdoc
      File "/usr/local/lib/python3.5/dist-packages/numpy/lib/__init__.py", line 8, in <module>
        from .type_check import *
      File "/usr/local/lib/python3.5/dist-packages/numpy/lib/type_check.py", line 11, in <module>
        import numpy.core.numeric as _nx
      File "/usr/local/lib/python3.5/dist-packages/numpy/core/__init__.py", line 24, in <module>
        raise ImportError(msg)
    ImportError:
    Importing the multiarray numpy extension module failed.  Most
    likely you are trying to import a failed build of numpy.
    If you're working with a numpy git repo, try `git clean -xdf` (removes all
    files not under version control).  Otherwise reinstall numpy. 

作为警告,我实际上是通过首先使用 cpu tensorflow docker 映像来完成所有这些工作的。所以我在一个以 cpu tensorflow 映像为基础映像的 docker 容器中完成了所有这些工作。特别是:

FROM gcr.io/tensorflow/tensorflow:latest-devel-py3

我还做了一些 hacky 来检查至少是否可行,但它没有。我所做的是在 python3.5 的sys.path 中附加我的 python3.4 包的路径。所以我转到python3.5 的命令行,然后我导入 sys 并继续将以下字符串添加到 sys.path:

sys.path.append('/usr/local/lib/python3.4/dist-packages')

它设法导入我拥有的其他库,但它无法导入 numpy:

>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/numpy/__init__.py", line 142, in <module>
    from . import add_newdocs
  File "/usr/local/lib/python3.4/dist-packages/numpy/add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "/usr/local/lib/python3.4/dist-packages/numpy/lib/__init__.py", line 8, in <module>
    from .type_check import *
  File "/usr/local/lib/python3.4/dist-packages/numpy/lib/type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "/usr/local/lib/python3.4/dist-packages/numpy/core/__init__.py", line 14, in <module>
    from . import multiarray
ImportError: cannot import name 'multiarray'

除了 numpy 之外的大多数其他软件包似乎都很好。可能当我 pip 安装 numpy 时,它会自动转到 python 3.4 版本或其他版本?


另外,如果可以让他们的答案在 Dockerfile 中工作,那将非常有帮助!

【问题讨论】:

  • 好像pip3 这里是你的python 3.4 版本。对于 python 3.5 版本,您将需要一个单独的 pip 版本。如果未安装该 python 版本的pip 版本,则必须下载get-pip.py 脚本并使用python3.5 安装进行安装。这应该为python3.5 创建一个pip。只要确保你symbolically link这个新点到你的PATH,名字就像pip35
  • @Abdou 谢谢 Abdou,我也想到了这个建议,我已经尝试了几天。如果您知道该怎么做,我将非常感谢您提供一些代码或命令的答案。同时我会继续努力。
  • 哪一部分你无法完成?如果您下载了get-pip.py 脚本,只需将您的python3.5 版本指向它:python3.5 get-pip.py。这将为该版本的python安装pip。之后,您可以运行类似:python3.5 -m pip install -U numpy,如果您无法将这个新的pip 链接到您的PATH。如果遇到权限问题,请使用sudo
  • @Abdou 我认为我的困惑是我本质上是在 Dockerfile 中执行此操作。因此,我真的不知道如何获得get-pip.py。就像我可以登录到特定容器一样,但这不是我想要做的,我希望我的图像具有 pip 而不仅仅是一个容器。感觉这是我的 python 应该附带的东西。我是否需要明确下载该文件并将其卷起来,还是它已经包含在某个地方?
  • 如果python3.5 -m pip 返回类似No module named pip 的内容,那么您的python3.5 没有附带“那个文件”;在这种情况下,您可以搜索“get-pip”,单击第一个结果并将脚本保存为 Python 文件(命名为 get-pip.py)到您的机器上。随后,您将需要运行python3.5 path_of_the_get-pip.py_script

标签: python ubuntu numpy pip


【解决方案1】:

您不能在 Python 版本之间混用和匹配。每个版本都需要自己的 NumPy 副本。这是因为 Python 不提供跨版本的二进制兼容性。对于纯 Python 包(没有编译代码,就像 NumPy 一样),它原则上可以工作,但环境很难管理。一些发行版通过符号链接共享 .py 文件。

首先是删除错误的安装。 我将只专注于让 python 3.5 安装工作

cd /usr/local/lib/python3.5/dist-packages

继续前的警告应谨慎使用rm 命令,尤其是您需要root 权限才能在/usr 中操作。

rm -r numpy

(作为根)。

那么,你需要点子。您可以使用 pypi 网页中的文件安装它:https://pip.pypa.io/en/latest/installing/

cd
wget https://bootstrap.pypa.io/get-pip.py

并安装

python3.5 get-pip.py

您可以为整个计算机或仅当前用户执行此操作(使用--user 选项)。安装 pip 后,

python3.5 -m pip install -U numpy

应该这样做。

如果没有适合你的 Python 版本的二进制包,并且 pip 开始编译并且无法执行,请安装包 python3.5-dev

【讨论】:

  • 我可以在任何地方使用wget https://bootstrap.pypa.io/get-pip.py 还是必须在/usr/local/lib/python3.5/dist-packages 中? (也作为旁注,我在 Docker 容器中,所以我可以 rm 基本上不用担心)(另一个旁注,如果你没有 wgetapt-get install wget
  • 您不应该从/usr/local/lib/python3.5/dist-packages 执行wget。我包含了一个普通的cd,它将带你到wget之前的主目录。
  • 只是出于好奇,为什么不呢?另外,你的命令python3.5 -m 真的很棒!它基本上保证我为我假设的 python3.5 运行正确版本的 pip。所以我不能以某种方式覆盖旧的pip3 并让它永久指向我的python 3.5 版本?
  • 还有为什么pip3 install --target=/usr/local/lib/python3.5/dist-packages numpy 不起作用?你的答案有何不同?
  • (1) 在/usr/local/lib/python3.5/dist-packages 中只能有python 可导入模块。可能一些“垃圾”不会破坏您的安装,但使用它不是一个好主意。 (2)由于当前pip3是系统安装的,可以看能不能用apt-get卸载。然后使用 python3.5 再次通过get-pip.py 安装 pip(虽然我还没有尝试过)。 (3)pip3 ...命令会下载一个python3.4包,然后按照你的具体要求安装到python3.5目录树中。
猜你喜欢
  • 2017-04-26
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
相关资源
最近更新 更多