目录
- 一、简介
- 1.1 简要说明
- 1.2 编译背景
- 1.3 步骤
- 二、交叉编译curl
- 三、使用crossenv交叉编译python第三方库numpy
- 四、移植到linux开发板
- 五、参考文章链接
一、简介
1.1 简要说明
- 在ARM端使用pip安装python的第三方库,需要开发板能访问外网。开发板上网具体可以参考博客:嵌入式linux开发板,通过网线连接电脑,共享电脑无线网络,访问外网
- 我这里首先交叉编译了curl,用来请求 Web 服务器。这里主要用于下载pip工具。如果你的开发板有curl命令,就可以不编译;或者直接在网页端下载对应的pip包到开发板,而不通过curl命令。
- 这篇博客相当于之前在ubuntu中,基于Qt平台,调用python文件,交叉编译到嵌入式linux开发板上运行的延伸。之前只交叉编译了python,并没有编译python的第三方库。所以这里已经默认你已经交叉编译好python了,我交叉编译好的路径是:/home/book/arm-python;我所有安装包的路径为/home/book/pyarm。
所以如果不是参考我的博客交叉编译的python,下面命令出现的路径请修改为自己交叉编译python的相关路径
1.2 编译背景
- 交叉编译工具链:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
- ubuntu平台:ubuntu18.04.1 64bit
- 嵌入式linux开发板内核:NXP CORTEX-A7 IMX6ULL
1.3 步骤
- 交叉编译curl
- 使用crossenv交叉编译python第三方库numpy
- 移植到linux开发板
二、交叉编译curl
- 下载curl,https://curl.se/download.html。这里我使用目前最新版本curl-7.87.0。
- 解压:tar xzvf curl-7.87.0.tar.gz
- cd curl-7.87.0
- 配置编译环境:./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --with-zlib=/home/book/arm-python --with-ssl=/home/book/arm-python --enable-shared --disable-threaded-resolver --prefix=$(pwd)/tmp
注:这里curl依赖openssl和zlib。交叉编译openssl和zlib,可以参考博客:在ubuntu中,基于Qt平台,调用python文件,交叉编译到嵌入式linux开发板上运行 - make
- make install
- 将/home/book/pyarm/curl-7.87.0/tmp/中所有内容移植到开发板目录/home/book/arm-python。因为我交叉编译的python在开发板的目录是/home/book/arm-python。请对照修改为自己的目录。
三、使用crossenv交叉编译python第三方库numpy
- 这里的所有步骤都在ubuntu中进行,而不是开发板。
- 我使用的ubuntu本身自带python和python3。一般安装的虚拟机ubuntu都自带python,如果你的虚拟机没有,请根据虚拟机类型安装python3。比如ubuntu使用命令
sudo apt-get install python3
即可。 - 安装crossenv:
pip3 install crossenv
- 使用crossenv代表arm-python的虚拟环境:
python3 -m crossenv --without-pip /home/book/arm-python/bin/python3 cross_venv
cd cross_venv/cross/bin
- 激活虚拟环境:
source activate
- 下载pip安装包:
curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py -k
。因为我的ubuntu中python3的版本是3.6,所以下载3.6中的get-pip.py。 - ./python3 get-pip.py
- 在cross_venv这个虚拟环境中的安装Cython:
./pip3 install Cython
- 创建requestments.txt:
vi requirements.txt
, 里面写上numpy及版本号,这里我下载的版本是1.13.3,所以就写:
- 交叉编译numpy成为.whl格式的安装包:
./pip3 wheel --wheel-dir /home/book/arm-pylib -r requirements.txt
。/home/book/arm-pylib即.whl格式的numpy包的存储路径,你可以任意选择。
注意:因为高性能的numpy依赖lapack和atlas库,所以直接使用pip3命令交叉编译numpy时,它会去寻找lapack和atlas库,但是这里我还没有找到合适的方法交叉编译lapack库,希望知道的小伙伴不吝赐教。所幸这两个库对于安装NumPy包来说并不是强制依赖的,即不依赖lapack和atlas库编译出来的numpy功能正常,性能差一点。
解决方法就是在pip3编译之前设置环境变量:
export BLAS=None
export BLAS=None
export ATLAS=None
./pip3 wheel --wheel-dir /home/book/arm-pylib -r requirements.txt
- 结果:
- 注意,这里我们使用crossenv交叉编译后的numpy第三方库的后缀是linux_arm,而我们的目标板子是armv7l的,所以这里我们要手动的将numpy-1.13.3-cp36-cp36m-linux_arm.whl改为numpy-1.13.3-cp36-cp36m-linux_armv7l.whl。不然会报错。查看linux开发板架构,在开发板命令端使用命令:
uname -a
。
四、移植到linux开发板
- 将numpy-1.13.3-cp36-cp36m-linux_armv7l.whl移植到目录/home/book/arm-python/bin下。因为我交叉编译的python在开发板的目录是/home/book/arm-python/bin。请对照修改为自己的目录。
- 下载pip3:
./curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py -k
- 安装pip3:./python3 get-pip.py
这里会出现错误:
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host=‘pypi.org’, port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)’),)) - skipping
ERROR: Could not find a version that satisfies the requirement pip<22.0 (from versions: none)
ERROR: No matching distribution found for pip<22.0
意思是:无法从网页https://pypi.org/simple/pip/获取内容。
解决办法:更改为国内镜像地址。./python3 get-pip.py -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
- 验证pip3:./pip3 list
- 安装numpy:./pip3 install numpy-1.13.3-cp36-cp36m-linux_armv7l.whl -i http://pypi.douban.com/simple --trusted-host pypi.douban.com。
注:如果不想每次安装都指定镜像源,可以参考博客创建pip.conf文件指定镜像源。 - 验证numpy: