使用 python 3 和 numpy、scipy、pillow 和 matplotlib 在 Raspberry Pi 3B+ 上构建 docker 映像失败

Posted

技术标签:

【中文标题】使用 python 3 和 numpy、scipy、pillow 和 matplotlib 在 Raspberry Pi 3B+ 上构建 docker 映像失败【英文标题】:Building docker image on Raspberry Pi 3B+ with python 3 and numpy, scipy, pillow and matplotlib fails 【发布时间】:2022-01-21 06:34:05 【问题描述】:

我有一个运行 Raspbian Buster 的 Raspberry Pi 3B+。我正在运行一个使用 tensorflow-lite 运行时和其他模块(如枕头、numpy 和 matplotlib)的深度学习应用程序。我一直在尝试构建一个 docker 容器来分发应用程序。我发现使用所需的库从 Dockerfile 构建映像非常具有挑战性,并且在周末尝试不同的基础映像并研究该问题后几乎没有进展。

这里是 Dockerfile 的内容:

FROM python:3.7

WORKDIR /app
COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . /app

## There is more after this 
## to install tensorflow-lite runtime
## from copied-over .whl file.
## I have it left out 
## as I have yet to progress beyond this point.

我得到:ERROR: No matching distribution found for numpy==1.16.2

这是我的需求清单:

numpy==1.16.2
paho-mqtt==1.5.1
picamera==1.13
Pillow==5.4.1
scipy==1.1.0
matplotlib==3.0.2

我从pip freeze > requirements.txt 获得了这些特定版本,位于应用程序正在运行的 Pi 上。

我尝试过的:

    使用来自 docker hub 的不同基础镜像,包括一个来自 balena 的 armv7 与我的 Pi 上的设置相匹配(即带有 Python 3.7.4 的 Rasbian Buster)。 提取包含 numpy 的 docker 映像 (docker pull ellerbach/tensor_pillow_flask) 并尝试将其用作基础映像。 使用不同的 Raspberry Pi 3。

仍然没有进展。感谢你的帮助。错误信息全文为:

Step 4/5 : RUN pip install -r requirements.txt
 ---> Running in 6bee0e112272
Collecting numpy==1.16.2
  Downloading numpy-1.16.2.zip (5.1 MB)
[91m    ERROR: Command errored out with exit status 1:
     command: /usr/local/bin/python -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-o8ypxup1/numpy_0ed49f4dc38649d790838c7f052a364a/setup.py'"'"'; __file__='"'"'/tmp/pip-install-o8ypxup1/numpy_0ed49f4dc38649d790838c7f052a364a/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-tax52vej
         cwd: /tmp/pip-install-o8ypxup1/numpy_0ed49f4dc38649d790838c7f052a364a/
    Complete output (4 lines):
    running egg_info
    creating /tmp/pip-pip-egg-info-tax52vej/numpy.egg-info
    Running from numpy source directory.
    error: [Errno 1] Operation not permitted
    ----------------------------------------
[0m[91mWARNING: Discarding https://files.pythonhosted.org/packages/cf/8d/6345b4f32b37945fedc1e027e83970005fc9c699068d2f566b82826515f2/numpy-1.16.2.zip#sha256=6c692e3879dde0b67a9dc78f9bfb6f61c666b4562fd8619632d7043fb5b691b0 (from https://pypi.org/simple/numpy/) (requires-python:>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
[0m[91mERROR: Could not find a version that satisfies the requirement numpy==1.16.2 (from versions: 1.3.0, 1.4.1, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.2, 1.7.0, 1.7.1, 1.7.2, 1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1, 1.9.2, 1.9.3, 1.10.0.post2, 1.10.1, 1.10.2, 1.10.4, 1.11.0, 1.11.1, 1.11.2, 1.11.3, 1.12.0, 1.12.1, 1.13.0rc1, 1.13.0rc2, 1.13.0, 1.13.1, 1.13.3, 1.14.0rc1, 1.14.0, 1.14.1, 1.14.2, 1.14.3, 1.14.4, 1.14.5, 1.14.6, 1.15.0rc1, 1.15.0rc2, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.16.0rc1, 1.16.0rc2, 1.16.0, 1.16.1, 1.16.2, 1.16.3, 1.16.4, 1.16.5, 1.16.6, 1.17.0rc1, 1.17.0rc2, 1.17.0, 1.17.1, 1.17.2, 1.17.3, 1.17.4, 1.17.5, 1.18.0rc1, 1.18.0, 1.18.1, 1.18.2, 1.18.3, 1.18.4, 1.18.5, 1.19.0rc1, 1.19.0rc2, 1.19.0, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.19.5, 1.20.0rc1, 1.20.0rc2, 1.20.0, 1.20.1, 1.20.2, 1.20.3, 1.21.0rc1, 1.21.0rc2, 1.21.0, 1.21.1, 1.21.2, 1.21.3, 1.21.4)
[0m[91mERROR: No matching distribution found for numpy==1.16.2
[0m[91mWARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
[0m

【问题讨论】:

你能从你的 RPI 中 curl pypi.org/project/numpy 吗? @richardec 你的意思是这样的:curl https://pypi.org/project/numpy?这会在 pi 上以及带有 docker exec 的 docker 容器内部拉出一个 html 页面。希望我正确理解了您的建议。 你做到了。我只是想确保 RPI 可以连接到 PyPI。 能否将pip 的完整输出粘贴到问题中? @richardec 你的意思是 Dockerfile 中的FROM python 吗? tensorflow-lite 运行时仅适用于少数版本的 Python,例如 3.7。当然,我会尝试发布更新。谢谢你的建议。 【参考方案1】:

通过使用不同基础图像的反复试验过程来解决这个问题,直到我找到一个可行的。这完成了工作:

FROM arm32v7/python:3.7.10-buster

WORKDIR /app
COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . /app

需求清单有:

numpy==1.16.2
paho-mqtt==1.5.1
picamera==1.13
Pillow==5.4.1
scipy==1.1.0
matplotlib==3.0.2

为了安装 tensorflow-lite 运行时,我在 docker 容器中使用了 pip 安装程序以及来自 Google 的“.whl”文件的本地副本。我将此文件包含在根据 Dockerfile 复制的 app 文件夹中。现在我有了一个满足所有先决条件的 docker 容器。

感谢您的宝贵时间和建议。

【讨论】:

克星!实际上,根据我看到的帖子,我打算建议 buster...

以上是关于使用 python 3 和 numpy、scipy、pillow 和 matplotlib 在 Raspberry Pi 3B+ 上构建 docker 映像失败的主要内容,如果未能解决你的问题,请参考以下文章

python numpy/scipy曲线拟合

windows上安装numpy,scipy

Ubuntu16.04使用pip3和pip安装numpy,scipy,matplotlib

[Python] Scipy and Numpy

将 python、numpy 和 scipy 代码转换为 C++ 兼容代码?

Python中安装numpy matplotlib scipy