MENU

记录:为乐高EV3安装带更新Python版本的ev3dev系统 / 安装所需Python软件包(2)

• 2025 年 06 月 02 日 • 阅读: 54 • 未分类

上一部分,我们提到了为 EV3 简单安装几个 Python 软件包的方法。下面我们更进一步,演示安装 Python 3.13.3 和 SciPy 软件包的过程。本文末将附上经过这些操作之后可直接烧录的 img 镜像。(由于在不断摸索中完成,成品与下面演示所得并不完全相同,具体修改的部分将另行说明)

实验性质

以下所有操作均不保证能达到预期效果。操作如有错误,敬请读者批评指正。

更新:下方演示还未完善,请不要尝试。

仅图一乐

乐高 EV3 性能极低,如 SciPy 等并不能很好地在其上运行,如果一定要尝试,还需要配置 Swap 等才能使其运行。下面所提到的内容,“折腾”的意义远大于实际应用上的意义。更换到更高性能的设备,是更好的解决方案。

关键点:由于 Debian 10 早已停止支持,很多新的软件包并不能通过 apt 安装,我们需要先安装新版 GCC 编译器,再编译安装 Python,后续再安装所需软件包。对于 SciPy,编译安装的过程中需要依赖 OpenBLAS,我们需要一并编译安装。

  • 现假设已经按照上一部分所说进行了修改。我们以此为基础完成下面的操作。
  • 由于容器模拟 CPU 架构会造成很大的性能损失,直接在容器内编译 GCC 需要数个小时。因此,我们首先在宿主机(而非容器)交叉编译出适用于 EV3 的新版本 GCC 编译器,这里以 13.3.0 为例。第一步,准备交叉编译工具链:
# 安装依赖
sudo apt update
sudo apt install -y gperf bison flex texinfo help2man gawk libtool-bin automake libncurses-dev python3-dev
# 下载 crosstool-NG
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.27.0.tar.xz
tar xf crosstool-ng-1.27.0.tar.xz
cd crosstool-ng-1.27.0
# 编译安装 crosstool-NG 到 /opt/crosstool-ng
./configure --prefix=/opt/crosstool-ng
make -j$(nproc)
sudo make install
export PATH="/opt/crosstool-ng/bin:$PATH"
# 创建工具链配置
mkdir ~/armv5te-toolchain && cd ~/armv5te-toolchain
ct-ng arm-unknown-linux-gnueabi # 选择近似模板
ct-ng menuconfig # 编辑配置(修改见下方)

修改配置

只需要修改下面的内容,其他配置保持默认,完成后选择 Save 保存。

  • Target options:
  • Target Architecture: arm
  • Emit assembly for CPU: arm926ej-s
  • Operating System:
  • Version of linux: 4.19.324
  • Binary utilities:
  • Version of binutils: 2.40
  • C-library:
  • Version of glibc: 2.28
  • C compiler:
  • Version of gcc: 13.3.0
  • C++: 启用
  • Fortran: 启用

完成上面的配置后,开始构建工具链:

ct-ng build -j$(nproc)

参考用时

在网络条件良好的情况下,使用 Ubuntu (WSL 2) 的 i7-14650HX 机器耗时 19 分 33 秒。

[INFO ]  (elapsed: 19:33.15)
[INFO ]  Finishing installation (may take a few seconds)...

生成的工具链默认在 ~/x-tools/arm-unknown-linux-gnueabi

第二步,交叉编译适用于 EV3 的 GCC:

cd ~
# 添加环境变量
export CROSS_TOOLCHAIN_PATH="${HOME}/x-tools/arm-unknown-linux-gnueabi"
export PATH="${CROSS_TOOLCHAIN_PATH}/bin:$PATH"
# 下载源码准备编译
wget https://ftp.gnu.org/gnu/gcc/gcc-13.3.0/gcc-13.3.0.tar.gz
tar xf gcc-13.3.0.tar.gz
cd gcc-13.3.0
# 下载依赖
./contrib/download_prerequisites
# 编译并安装到指定路径,示例为 /usr/local/gcc-13.3
mkdir build && cd build
../configure --target=arm-unknown-linux-gnueabi --host=arm-unknown-linux-gnueabi --build=x86_64-linux-gnu --prefix=/usr/local/gcc-13.3 --with-sysroot=/ --enable-languages=c,c++,fortran --with-cpu=arm926ej-s --with-float=soft --disable-multilib --enable-multiarch
make -j$(nproc)
# 切换到 root 用户
sudo su
# 重新设置环境变量
export CROSS_TOOLCHAIN_PATH="【例如/home/ubuntu,根据实际安装情况设置】/x-tools/arm-unknown-linux-gnueabi"
export PATH="${CROSS_TOOLCHAIN_PATH}/bin:$PATH"
# 安装
make install
exit

参考用时

使用 Ubuntu (WSL 2) 的 i7-14650HX 机器执行 make -j$(nproc) 耗时 6 分 20 秒。

然后启动 Docker 容器,将上面安装在宿主机 /usr/local/gcc-13.3 的传输到容器中相同位置并进入容器:

sudo docker start 上一步查询到刚刚更改的容器 ID.例如 b09c76f149e1
sudo docker cp /usr/local/gcc-13.3 上一步查询到刚刚更改的容器 ID.例如 b09c76f149e1:/usr/local/
sudo rm -rf /usr/local/gcc-13.3 # 清理
sudo docker container exec -it 上一步查询到刚刚更改的容器 ID.例如 b09c76f149e1 /bin/bash

后续在容器内如需使用 新安装的 GCC 来编译,设置环境变量即可:

export CC=/usr/local/gcc-13.3/bin/gcc
export CXX=/usr/local/gcc-13.3/bin/g++
export FC=/usr/local/gcc-13.3/bin/gfortran
  • 接下来,我们编译安装 Python:
# 切换工作目录为 /home/robot
cd /home/robot
# 下载源码准备编译
wget https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tgz
tar xzf Python-3.13.3.tgz
cd Python-3.13.3
# 配置编译选项,启用优化
./configure --enable-optimizations --with-lto --host=arm-linux-gnueabi --build=arm-linux-gnueabi
# 编译并安装,不影响已安装的 Python 版本
make -j$(nproc)
make altinstall

完成上面的步骤后,我们就可以使用 python3.13pip3.13 命令了。

  • 下面新建一个虚拟环境,后续将需要的软件包安装到这个新虚拟环境里:
# 创建虚拟环境并激活
python3.13 -m venv /home/robot/venv313
source /home/robot/venv313/bin/activate
  • 在安装 SciPy 前,需要编译安装 OpenBLAS。这里就以 0.3.29 版本为例:
# 切换工作目录为 /home/robot
cd /home/robot
# 下载源码准备编译
wget https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.29/OpenBLAS-0.3.29.tar.gz
tar xzf OpenBLAS-0.3.29.tar.gz
cd OpenBLAS-0.3.29
# 编译并安装
make TARGET=ARMV5 ARM_SOFTFP_ABI=1
make TARGET=ARMV5 ARM_SOFTFP_ABI=1 PREFIX=/usr/local install

提示

如果在编译中(还有安装部分其他软件包时)遇到错误,可尝试改用系统自带的 GCC 8.3.0:

unset CC
unset CXX
unset FC

但在编译安装 SciPy 前需要改回高版本,否则编译无法通过。

  • 回到正题,安装 SciPy 软件包:
pip install numpy scipy --verbose # 编译用时长,建议启用 --verbose 参数查看调试信息
  • 打包前,更改虚拟环境所属用户为 robot 并删除上面构建用的源码,然后退出容器:
chown -R robot /home/robot/venv313
rm -rf /home/robot/Python-3.13.3*
rm -rf /home/robot/gcc-13.3.0*
rm -rf /home/robot/OpenBLAS-0.3.29*
exit
  • 最后就是熟悉的 brickstrap 打包环节了,不过需要注意,经过上述操作,镜像文件大小很可能超过了 3600M,需要配置环境变量才能正常生成:
# 提交到镜像
sudo docker container commit 此前查询到的容器ID.例如b09c76f149e1 ev3d10new:latest
# 用 brickstrap 工具打包得到可烧录的镜像,注意配置生成 img 文件大小,不能小于实际占用
sudo su
brickstrap create-tar ev3d10new:latest ev3dev10new.tar
BRICKSTRAP_IMAGE_FILE_SIZE=7200M brickstrap create-image ev3d10new.tar ev3d10-gcc13-py313-scipy.img

这样,得到的 ev3d10-gcc13-py313-scipy.img 就是我们所需要的可烧录系统镜像。


在本文的最后,给出我们实际使用的 img 系统镜像。

从 轻传云笺 下载

从 百度网盘 下载

请校验下载文件信息

文件名 ev3d10-gcc13-py313-scipy.7z

MD5 6c3c9fbe27109987467ba550b37cefda

SHA-1 99d24a8996d368baaf4268c88c4f072659cf8762

一些细节

  1. 基于 growflavor/ev3images:ev3dev10imgv02b 制作;
  2. 文件大小设置为 7200M ,需要容量 8GB 以上的 SD 卡以安装;
  3. 原有 Python 3.11.9 虚拟环境(/home/robot/venv311)内额外安装了 Flask flask-cors requests evdev
  4. 安装了 GCC (C, C++) 8.5.0GCC (C, C++, Fortran) 13.3.0
  5. 使用 GCC 13.3.0 构建的 Python 3.13.3,编译选项配置为 --enable-optimizations --with-lto
  6. 系统内 Python 3.13 已安装的包保存在 /home/robot/requirements313.txt

    ninja==1.11.1.4
    setuptools==80.9.0
  7. 虚拟环境 /home/robot/venv313 已安装的包保存在 /home/robot/requirements313venv.txt

    beniget==0.4.2.post1
    blinker==1.9.0
    certifi==2025.4.26
    charset-normalizer==3.4.2
    click==8.2.1
    cmake==4.0.2
    compilers==0.0.0
    contourpy==1.3.2
    cppy==1.3.1
    cycler==0.12.1
    Cython==3.1.1
    evdev==1.9.2
    Flask==3.1.1
    flask-cors==6.0.0
    fonttools==4.58.1
    gast==0.6.0
    idna==3.10
    itsdangerous==2.2.0
    Jinja2==3.1.6
    kiwisolver==1.4.8
    MarkupSafe==3.0.2
    matplotlib==3.10.3
    meson==1.8.1
    meson-python==0.18.0
    ninja==1.11.1.4
    numpy==2.2.6
    packaging==25.0
    pillow==11.2.1
    plumbum==1.9.0
    ply==3.11
    pybind11==2.13.6
    pyblas==0.0.10
    pyparsing==3.2.3
    pyproject-metadata==0.9.1
    python-dateutil==2.9.0.post0
    python-ev3dev==1.2.0
    python-ev3dev2==2.1.0.post1
    pythran==0.18.0
    PyYAML==6.0.2
    requests==2.32.3
    rpyc==6.0.2
    scipy==1.15.3
    setuptools==80.9.0
    setuptools-scm==8.3.1
    six==1.17.0
    urllib3==2.4.0
    Werkzeug==3.1.3
    wheel==0.45.1

不是所有涉及编译安装的依赖、软件包都使用 GCC 13.3.0 构建。大部分仍用系统自带的 GCC 8.3.0 完成构建。

最后编辑于: 2025 年 06 月 04 日