【飞凌嵌入式FCU1501试用】在ARM开发板上安装完整Python环境

【飞凌嵌入式FCU1501试用】在ARM开发板上安装完整Python环境
文章目录一、问题背景二、失败的尝试2.1 尝试 ensurepip2.2 尝试手动解压 wheel2.3 尝试 zlib stub三、解决方案借花献佛——使用 Debian 预编译包3.1 思路3.2 下载 Debian Python 包3.3 提取并安装3.4 创建 wrapper 脚本四、安装 pip4.1 下载 get-pip.py4.2 安装4.3 修复 SSL 证书4.4 配置 pip五、安装 NumPy可选5.1 下载并提取5.2 安装依赖库5.3 更新 PYTHONPATH5.4 测试六、磁盘空间优化6.1 清理临时文件6.2 清理 pip 缓存6.3 删除测试文件6.4 清理 .pyc 缓存6.5 清理效果七、最终环境概览7.1 完整的 wrapper 脚本7.2 日常使用7.3 安装其他 Debian 预编译包的通用方法八、总结硬件飞凌嵌入式 FCU1501Rockchip RK3506ARMv7l 架构系统Buildroot 2024.02glibc 2.38自带 Python3.11.8但被大幅裁剪缺少 zlib/ssl/xml 等核心模块一、问题背景飞凌 FCU1501 是一款基于 Rockchip RK3506 的 ARMv7l 开发板出厂自带 Buildroot 2024.02 系统和 Python 3.11.8。但实际使用中发现这个 Python 被 Buildroot 裁剪得非常精简大量核心 C 扩展模块缺失rootok3506:~# python3 --versionPython3.11.8 rootok3506:~# python3 -c import zlibTraceback(most recent call last): Filestring, line1,inmoduleModuleNotFoundError: No module namedzlibrootok3506:~# python3 -c import sslTraceback(most recent call last): Filestring, line1,inmoduleModuleNotFoundError: No module namedssl排查后发现缺失的模块清单如下模块状态影响zlib❌ 缺失无法解压 wheel 包pip 无法工作ssl/_ssl❌ 缺失无法 HTTPS 连接 PyPIxml/pyexpat❌ 缺失pip 内部依赖崩溃hashlib❌ 缺失SSL 证书校验失败sqlite3❌ 缺失无法使用 SQLite 数据库bz2/lzma❌ 缺失部分压缩格式不支持最关键的是——厂家没有提供 Buildroot 源码无法通过make menuconfig重新编译 Python 来开启这些模块。这就陷入了一个死局没有编译器板子上没有 gcc没有 Buildroot 源码Python 又缺核心模块。pip 装不上装上了也跑不起来。二、失败的尝试2.1 尝试 ensurepipPython 自带的ensurepip模块可以引导安装 pip但在这块板子上直接失败了rootok3506:~# python3 -m ensurepip --default-pipTraceback(most recent call last):... zipimport.ZipImportError: cant decompress data;zlib not available原因很明确Python 编译时没有链接 zlib无法解压 ensurepip 内置的 wheel 包。2.2 尝试手动解压 wheel板子上有unzip命令于是尝试手动解压 ensurepip 内置的 pip wheelcd/tmpunzip-o/usr/lib/python3.11/ensurepip/_bundled/pip-24.0-py3-none-any.whl-dpip_extractcp-rpip_extract/pip /usr/lib/python3.11/site-packages/文件是放进去了但运行时直接崩溃rootok3506:~# pip3 --versionTraceback(most recent call last):... ImportError: libz.so.1: cannotopenshared objectfilepip 内部依赖 zlib 模块不是简单放文件就能解决的。2.3 尝试 zlib stub甚至尝试写了一个 Python 纯实现的 zlib stub 模块来骗过 pip# /usr/lib/python3.11/site-packages/zlib.pyclassdecompressobj:defdecompress(self,data):returndata# 直接返回原始数据defdecompress(data,wbits15,bufsize0):returndatapip --version 确实能跑了但安装包时立刻报错——因为 wheel 内部的文件是真正用 zlib 压缩过的假模块解不开。结论在裁剪过的 Buildroot Python 上硬装 pip此路不通。三、解决方案借花献佛——使用 Debian 预编译包3.1 思路既然板子用的是 glibc 2.38而 Debian Bookworm 的 armhf 架构ARM Hard Float与 ARMv7l 的 ABI 兼容那 Debian 的 Python 二进制文件应该可以直接在这块板子上运行。关键验证点rootok3506:~# uname -marmv7l rootok168.1.232:~# strings /lib/libc.so.6 | grep GNU C LibraryGNU C Library(glibc)stable release version2.38. rootok3506:~# /lib/ld-linux-armhf.so.3 --version# armhf 加载器存在说明支持 hard-float ABI3.2 下载 Debian Python 包从 Debian 中国镜像下载 3 个 armhf 的 .deb 包mkdir-p/tmp/debcd/tmp/deb# 核心三个包curl-sL-opython3.11-minimal.deb\http://ftp.cn.debian.org/debian/pool/main/p/python3.11/python3.11-minimal_3.11.2-6deb12u7_armhf.debcurl-sL-olibpython3.11-minimal.deb\http://ftp.cn.debian.org/debian/pool/main/p/python3.11/libpython3.11-minimal_3.11.2-6deb12u7_armhf.debcurl-sL-olibpython3.11-stdlib.deb\http://ftp.cn.debian.org/debian/pool/main/p/python3.11/libpython3.11-stdlib_3.11.2-6deb12u7_armhf.deb3.3 提取并安装Buildroot 系统没有dpkg但可以用artar手动提取 .debmkdir-p/tmp/python3.11_fullcd/tmp/python3.11_fullfordebin/tmp/deb/python3.11-minimal.deb\/tmp/deb/libpython3.11-minimal.deb\/tmp/deb/libpython3.11-stdlib.deb;doar x$debxz-ddata.tar.xz|tarxf -rm-fdebian-binary control.tar.xz data.tar.xzdone提取后的目录结构是标准的usr/bin、usr/lib等直接复制到/optrm-rf/opt/python3.11mkdir-p/opt/python3.11cp-a/tmp/python3.11_full/usr/* /opt/python3.11/3.4 创建 wrapper 脚本为了让新 Python 与原系统 Python 共存创建一个 wrapper 脚本cat/usr/bin/python3-fullEOF #!/bin/sh export PYTHONHOME/opt/python3.11 export PYTHONPATH/opt/python3.11/lib/python3.11:/opt/python3.11/lib/python3.11/lib-dynload export PATH/opt/python3.11/local/bin:/opt/python3.11/bin:$PATH exec /opt/python3.11/bin/python3.11 $ EOFchmodx /usr/bin/python3-full验证rootok3506:~# python3-full --versionPython3.11.2 rootok3506:~# python3-full -c import zlib, ssl, xml, hashlib, sqlite3; print(All OK)All OK所有缺失的模块全部恢复正常四、安装 pip4.1 下载 get-pip.pycurl-sL-o/tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py4.2 安装python3-full /tmp/get-pip.py\--no-warn-script-location\--break-system-packages\--trusted-host pypi.org\--trusted-host files.pythonhosted.org安装成功后创建 pip wrappercat/usr/bin/pip3-fullEOF #!/bin/sh export PYTHONHOME/opt/python3.11 export PYTHONPATH/opt/python3.11/lib/python3.11:/opt/python3.11/lib/python3.11/lib-dynload export PATH/opt/python3.11/local/bin:/opt/python3.11/bin:$PATH exec /opt/python3.11/bin/python3.11 -m pip $ EOFchmodx /usr/bin/pip3-full4.3 修复 SSL 证书pip 能跑但访问 PyPI 时 SSL 证书校验会失败板子没有系统 CA 证书包。安装certifi解决pip3-fullinstallcertifi然后在 wrapper 脚本中加入证书路径exportSSL_CERT_FILE/opt/python3.11/local/lib/python3.11/dist-packages/certifi/cacert.pem4.4 配置 pipmkdir-p/opt/python3.11/etccat/opt/python3.11/pip.confEOF [global] trusted-host pypi.org files.pythonhosted.org break-system-packages true root-user-action ignore EOF验证端到端rootok3506:~# pip3-full --versionpip26.1.2 from /opt/python3.11/local/lib/python3.11/dist-packages/pip(python3.11)rootok3506:~# pip3-full install requestsSuccessfully installed requests-2.34.2 rootok3506:~# python3-full -c import requests; print(requests.get(https://pypi.org).status_code)200五、安装 NumPy可选嵌入式开发板上经常需要数值计算但 PyPI 上没有 armv7l 的预编译 NumPy wheel源码编译又没有 gcc。解决方案同样是借用 Debian armhf 的预编译包。5.1 下载并提取cd/tmpcurl-sLopython3-numpy.deb\http://ftp.cn.debian.org/debian/pool/main/n/numpy/python3-numpy_1.24.2-1deb12u1_armhf.debmkdir-p/tmp/numpy_extractcd/tmp/numpy_extract ar x../python3-numpy.deb xz-ddata.tar.xz|tarxf -cp-rusr/lib/python3.11/dist-packages/numpy*\/opt/python3.11/lib/python3.11/site-packages/5.2 安装依赖库NumPy 的 .so 文件依赖 BLAS/LAPACK 库同样从 Debian 下载cd/tmpcurl-sLolibblas3.deb\http://ftp.cn.debian.org/debian/pool/main/l/lapack/libblas3_3.11.0-2_armhf.debcurl-sLoliblapack3.deb\http://ftp.cn.debian.org/debian/pool/main/l/lapack/liblapack3_3.11.0-2_armhf.debcurl-sLolibgfortran5.deb\http://ftp.cn.debian.org/debian/pool/main/g/gcc-12/libgfortran5_12.2.0-14deb12u1_armhf.debmkdir-p/tmp/lib_extractcd/tmp/lib_extractfordebin/tmp/libblas3.deb /tmp/liblapack3.deb /tmp/libgfortran5.deb;doar x$debxz-ddata.tar.xz|tarxf -rm-fdebian-binary control.tar.xz data.tar.xzdone# 复制 .so 到系统库目录cp$(find.-name*.so*)/lib/5.3 更新 PYTHONPATHwrapper 脚本的 PYTHONPATH 需要包含 site-packagesexportPYTHONPATH/opt/python3.11/lib/python3.11:/opt/python3.11/lib/python3.11/lib-dynload:/opt/python3.11/lib/python3.11/site-packages:/opt/python3.11/local/lib/python3.11/dist-packages5.4 测试importnumpyasnpimporttime# 基本功能anp.array([1,2,3,4,5])print(f版本:{np.__version__})print(f数组:{a})print(f均值:{np.mean(a)})# 线性代数mnp.array([[1,2],[3,4]])print(f行列式:{np.linalg.det(m)})print(f特征值:{np.linalg.eig(m)[0]})# FFTsignalnp.array([1,2,1,-1,-2,-1])print(fFFT:{np.round(np.fft.fft(signal),2)})# 性能t0time.time()resultnp.dot(np.random.rand(1000,1000),np.random.rand(1000,1000))print(f1000x1000 矩阵乘法:{time.time()-t0:.1f}s)输出版本: 1.24.2 数组: [1 2 3 4 5] 均值: 3.0 行列式: -2.0 特征值: [-0.37 5.37] FFT: [0.0.j 3.-5.2j 0.0.j 0.0.j 0.0.j 3.5.2j] 1000x1000 矩阵乘法: 20.1s全部功能正常。1000×1000 矩阵乘法 20 秒ARMv7l 无 NEON 优化的预期水平。六、磁盘空间优化嵌入式开发板存储空间有限根分区 458M安装 Python pip 后空间紧张。以下是实际清理记录6.1 清理临时文件# 安装过程中产生的临时文件rm-rf/tmp/pip_extract /tmp/setuptools_extractrm-f/root/get-pip.pyrm-rf/tmp/deb /tmp/deb_extract /tmp/python3.11_full /tmp/numpy_extract /tmp/lib_extract6.2 清理 pip 缓存rm-rf/root/.cache/pip6.3 删除测试文件# setuptools 自带的测试目录rm-rf/opt/python3.11/local/lib/python3.11/dist-packages/setuptools/testsrm-rf/opt/python3.11/local/lib/python3.11/dist-packages/setuptools/_distutils/tests6.4 清理 .pyc 缓存Python 运行时会自动生成.pyc字节码缓存文件在嵌入式设备上意义不大find/opt/python3.11-typed-name__pycache__-execrm-rf{}在 wrapper 脚本中加入环境变量防止 .pyc 自动重建exportPYTHONDONTWRITEBYTECODE16.5 清理效果已用可用使用率清理前435M0M100%清理后296M130M70%共释放 139M 空间。七、最终环境概览7.1 完整的 wrapper 脚本/usr/bin/python3-full#!/bin/shexportPYTHONHOME/opt/python3.11exportPYTHONPATH/opt/python3.11/lib/python3.11:/opt/python3.11/lib/python3.11/lib-dynload:/opt/python3.11/lib/python3.11/site-packages:/opt/python3.11/local/lib/python3.11/dist-packagesexportSSL_CERT_FILE/opt/python3.11/local/lib/python3.11/dist-packages/certifi/cacert.pemexportPYTHONDONTWRITEBYTECODE1exportPATH/opt/python3.11/local/bin:/opt/python3.11/bin:$PATHexec/opt/python3.11/bin/python3.11$/usr/bin/pip3-full#!/bin/shexportPYTHONHOME/opt/python3.11exportPYTHONPATH/opt/python3.11/lib/python3.11:/opt/python3.11/lib/python3.11/lib-dynload:/opt/python3.11/lib/python3.11/site-packages:/opt/python3.11/local/lib/python3.11/dist-packagesexportSSL_CERT_FILE/opt/python3.11/local/lib/python3.11/dist-packages/certifi/cacert.pemexportPYTHONDONTWRITEBYTECODE1exportPATH/opt/python3.11/local/bin:/opt/python3.11/bin:$PATHexec/opt/python3.11/bin/python3.11-mpip$7.2 日常使用# 查看版本python3-full--version# Python 3.11.2pip3-full--version# pip 26.1.2# 安装第三方包pip3-fullinstallrequests# 原系统 Python 不受影响python3--version# Python 3.11.8 (Buildroot 原始版)7.3 安装其他 Debian 预编译包的通用方法如果某个包在 PyPI 上没有 armv7l 的 wheel很常见可以用同样的方法从 Debian armhf 仓库安装在 https://packages.debian.org/bookworm/armhf/ 搜索包名下载.deb文件ar xxz -d | tar xf提取将 Python 包复制到/opt/python3.11/lib/python3.11/site-packages/将.so依赖库复制到/lib/八、总结方案可行性说明Buildroot 重新编译✅ 最佳需要源码厂家未提供板上源码编译❌ 不可行板上无 gcc无 Python dev headersensurepip 引导❌ 不可行Python 缺 zlib无法解压 wheelzlib stub 绕过❌ 不可行ssl、xml 也缺失pip 无法正常工作Debian armhf 预编译包✅可行glibc 兼容ABI 匹配完美运行核心原理飞凌 FCU1501 使用 glibc 2.38与 Debian Bookworm armhf 的 ABI 完全兼容。通过提取 Debian 预编译的 Python 二进制和标准库可以在不重新编译的情况下获得完整的 Python 环境。这套方案的优点零编译不需要 gcc不需要源码零冲突与原系统 Python 隔离运行互不干扰完整功能zlib、ssl、xml、sqlite3 等模块全部可用pip 可用可以正常从 PyPI 安装纯 Python 包局限需要联网下载根分区空间有限458M需精打细算需要编译的包如 NumPy需额外从 Debian 仓库获取预编译版本本文记录了在飞凌 FCU1501 开发板上从零搭建完整 Python 环境的全过程希望能帮助到同样受困于 Buildroot 裁剪 Python 的嵌入式开发者。如果你有 Buildroot 源码还是建议通过make menuconfig开启 Python 的 zlib/ssl/xml 模块重新编译那才是最干净的方案。