在上一部分,我们提到了为 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
: armEmit 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.0C++
: 启用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.13
和 pip3.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
一些细节
- 基于
growflavor/ev3images:ev3dev10imgv02b
制作; - 文件大小设置为
7200M
,需要容量 8GB 以上的 SD 卡以安装; - 原有 Python 3.11.9 虚拟环境(
/home/robot/venv311
)内额外安装了Flask flask-cors requests evdev
; - 安装了
GCC (C, C++) 8.5.0
和GCC (C, C++, Fortran) 13.3.0
; - 使用 GCC 13.3.0 构建的 Python 3.13.3,编译选项配置为
--enable-optimizations --with-lto
; 系统内 Python 3.13 已安装的包保存在
/home/robot/requirements313.txt
:ninja==1.11.1.4 setuptools==80.9.0
虚拟环境
/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
本文(https://www.cgtsoft.com/archives/46/)来源于 CGT Software,使用 CC BY-NC-SA 4.0 许可发布。