来自 alpine 软件包存储库的 Numpy 无法导入 c 扩展

2024-04-30

我正在制作一个需要 pandas 和 numpy 的 docker 映像,但通过 pip 安装大约需要 20 分钟,这对于我的用例来说太长了。然后我选择从 alpine 软件包存储库安装 pandas 和 numpy,但似乎无法正确导入 numpy。

这是我的 Dockerfile:

# syntax=docker/dockerfile:experimental
FROM python:3.9.5-alpine as base

FROM base as builder
RUN apk add build-base gcc musl-dev

RUN --mount=type=cache,target=/root/.cache/pip \
    pip install --target="/install" django

FROM base
RUN apk add py3-pandas py3-numpy

COPY --from=builder /install /usr/local/lib/python3.9/site-packages

ENV PYTHONPATH "${PYTHONPATH}:/usr/lib/python3.9/site-packages"

CMD ["python"]

当我尝试导入依赖于 numpy 的 pandas 时,出现错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/site-packages/pandas/__init__.py", line 16, in <module>
    raise ImportError(
ImportError: Unable to import required dependencies:
numpy: 

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.9 from "/usr/local/bin/python"
  * The NumPy version is: "1.20.3"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: No module named 'numpy.core._multiarray_umath'

如果我导入 numpy 会出现错误:

Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/numpy/core/__init__.py", line 22, in <module>
    from . import multiarray
  File "/usr/lib/python3.9/site-packages/numpy/core/multiarray.py", line 12, in <module>
    from . import overrides
  File "/usr/lib/python3.9/site-packages/numpy/core/overrides.py", line 7, in <module>
    from numpy.core._multiarray_umath import (
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/site-packages/numpy/__init__.py", line 145, in <module>
    from . import core
  File "/usr/lib/python3.9/site-packages/numpy/core/__init__.py", line 48, in <module>
    raise ImportError(msg)
ImportError: 

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.9 from "/usr/local/bin/python"
  * The NumPy version is: "1.20.3"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: No module named 'numpy.core._multiarray_umath'

我已经束手无策,试图找出我错过了什么和做错了什么。我已经尝试了错误跟踪给出的 url 中的故障排除提示,但似乎没有解决问题。

任何帮助是极大的赞赏。


我知道自从有人提出这个问题以来已经有一段时间了,您可能已经找到了解决方案,或者从 Alpine 转移到了另一个发行版。但我遇到了同样的问题,这是我搜索中出现的第一件事。因此,在花了几个小时找到解决方案之后,我认为值得在这里记录下来。

问题(显然)是numpy and pandas包。我使用了社区存储库中的预制轮子,并遇到了与您相同的问题。因此,显然,构建过程本身就引入了这个问题。具体来说,如果您查看,例如,在numpy/core在安装位置(/usr/lib/python3.9/site-packages),你会发现所有的 C 扩展都有.cpython-39-x86_64-linux-musl以他们的名义。例如,您遇到问题的模块,numpy.core._multiarray_umath, 被命名_multiarray_umath.cpython-39-x86_64-linux-musl.so,而且不仅仅是_multiarray_umath.so。丢弃.cpython-39-x86_64-linux-musl从这些文件名修复了问题(编辑:有关详细信息,请参阅附录)。

可以将以下行添加到您的Dockerfile安装后py3-pandas and py3-numpy要解决这个问题:

RUN find /usr/lib/python3.9/site-packages -iname "*.so" -exec sh -c 'x="{}"; mv "$x" "${x/cpython-39-x86_64-linux-musl./}"' \;

P.S.:在进一步研究这个问题之后,我找到了罪魁祸首:出于某种原因,在 Alpine 下运行的 Python 认为它的完整平台扩展后缀(可从importlib.machinery.EXTENSION_SUFFIXES) 应该cpython-39-x86_64-linux-gnu.so, 并不是cpython-39-x86_64-linux-musl.so。我不相信它是用 glibc 构建的,但谁知道呢。所以,你可以改变musl to gnu在上面那些共享对象的名称中,它也可以工作。不知道为什么构建期间生成的扩展后缀与 Python 在运行时使用的扩展后缀不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 alpine 软件包存储库的 Numpy 无法导入 c 扩展 的相关文章

  • 在 HDF5 (PyTables) 中存储 numpy 稀疏矩阵

    我在使用 PyTables 存储 numpy csr matrix 时遇到问题 我收到此错误 TypeError objects of type csr matrix are not supported in this context so
  • 如何从 pandas 数据框中的列中删除字符串值

    我正在尝试编写一些代码 以逗号分隔数据帧列中的字符串 因此它成为一个列表 并从该列表中删除某个字符串 如果存在 删除不需要的字符串后 我想再次以逗号加入列表元素 我的数据框如下所示 df Column1 Column2 0 a a b c
  • 在 docker 中将 pgadmin 连接到 postgres

    我有一个docker compose与服务文件python nginx postgres and pgadmin services postgres image postgres 9 6 env file env volumes postg
  • docker build --no-cache 是否构建不同的层?

    几个月前 我决定使用以下命令设置我的项目构建 docker 镜像的 CIno cacheflag 我认为最好不要冒险让 docker 使用旧的缓存层 我现在才意识到 我的图像各层的 sha 总是不同的 即使新构建的图像应该生成与之前构建的相
  • numpy:如何连接数组? (获得多个范围的并集)

    我使用Pythonnumpy 我有一个 numpy 索引数组a gt gt gt a array 5 7 12 18 20 29 gt gt gt type a
  • 如何从连接到外部网络的另一个组合访问容器?

    这是带有容器配置的撰写文件 我希望从外部容器连接到该容器 在另一个撰写文件中定义 version 3 5 services service to connect to build networks my external network n
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • 两个 pandas 列的字符串连接

    我有一个关注者DataFrame from pandas import df DataFrame foo a b c bar 1 2 3 它看起来像这样 bar foo 0 1 a 1 2 b 2 3 c 现在我想要这样的东西 bar 0
  • 将 Pandas TimeDelta 转换为整数

    假设我有一个包含 TimeDelta 数据的 Pandas Series 事实上 它是通过将 DateTimeIndex 与其自身的移位版本进行差值生成的 从而给出了连续时间戳之间的增量 它看起来像 timestamp 2015 02 01
  • Pandas DataFrame 具有 X、Y 坐标到 NumPy 矩阵

    我有一个包含列的 DataFrameX Y and value e g X Y value 1 1 56 2 1 13 3 1 25 1 2 7 2 2 18 1 123 91 50 123 32 我需要将其转换为 DataFrame 到
  • 如何处理 pandas.read_csv 中的元数据行?

    我有一个 txt 文件 其中包含元数据标题 后跟 csv 样式的实际数据 数据包含带逗号的浮点数 像这样 title someTitle date 20 0 2019 col str1 str2 str3 2 49 42 01 0 50 5
  • 如何修复 TypeError: G 必须是 'd' 矩阵?

    目标 尝试通过优化过程运行玩具数据集 我遇到以下错误 TypeError Traceback most recent call last
  • Pandas 数据框到 Excel 工作表

    我有一个包含 5 个工作表的 Excel 文件 xls 格式 我想用 pandas 数据框的内容替换第 5 个工作表的内容 根据您的上述需求 您将需要使用 Python 导出 pandas 数据框 和 VBA 删除现有工作表内容并复制 粘贴
  • 使用步幅沿轴填充每个切片上的对角线

    考虑 numpy 数组a a np arange 18 reshape 2 3 3 print a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 我想沿着每个切片的对角线填充axis 0我使用以下方
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • Pandas hub_table 更快的替代品

    我正在使用熊猫pivot table在大型数据集 1000 万行 6 列 上运行 由于执行时间至关重要 因此我尝试加快流程 目前 处理整个数据集大约需要 8 秒 这太慢了 我希望找到替代方案来提高速度 性能 我当前的 Pandas 数据透视
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • Pandas 堆积条形图中元素的排序

    我正在尝试绘制有关某个地区 5 个地区的家庭在特定行业赚取的收入比例的信息 我使用 groupby 按地区对数据框中的信息进行排序 df df orig groupby District Portion of income value co
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor

随机推荐