嵌入式linux开发板,通过crossenv交叉编译python第三方库numpy

一、简介

1.1 简要说明

  1. 在ARM端使用pip安装python的第三方库,需要开发板能访问外网。开发板上网具体可以参考博客:嵌入式linux开发板,通过网线连接电脑,共享电脑无线网络,访问外网
  2. 我这里首先交叉编译了curl,用来请求 Web 服务器。这里主要用于下载pip工具。如果你的开发板有curl命令,就可以不编译;或者直接在网页端下载对应的pip包到开发板,而不通过curl命令。
  3. 这篇博客相当于之前在ubuntu中,基于Qt平台,调用python文件,交叉编译到嵌入式linux开发板上运行的延伸。之前只交叉编译了python,并没有编译python的第三方库。所以这里已经默认你已经交叉编译好python了,我交叉编译好的路径是:/home/book/arm-python;我所有安装包的路径为/home/book/pyarm所以如果不是参考我的博客交叉编译的python,下面命令出现的路径请修改为自己交叉编译python的相关路径

1.2 编译背景

  1. 交叉编译工具链:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
  2. ubuntu平台:ubuntu18.04.1 64bit
  3. 嵌入式linux开发板内核:NXP CORTEX-A7 IMX6ULL

1.3 步骤

  1. 交叉编译curl
  2. 使用crossenv交叉编译python第三方库numpy
  3. 移植到linux开发板

二、交叉编译curl

  1. 下载curl,https://curl.se/download.html。这里我使用目前最新版本curl-7.87.0。
  2. 解压:tar xzvf curl-7.87.0.tar.gz
  3. cd curl-7.87.0
  4. 配置编译环境:./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开发板上运行
  5. make
  6. make install
  7. 将/home/book/pyarm/curl-7.87.0/tmp/中所有内容移植到开发板目录/home/book/arm-python。因为我交叉编译的python在开发板的目录是/home/book/arm-python。请对照修改为自己的目录。

三、使用crossenv交叉编译python第三方库numpy

  1. 这里的所有步骤都在ubuntu中进行,而不是开发板
  2. 我使用的ubuntu本身自带python和python3。一般安装的虚拟机ubuntu都自带python,如果你的虚拟机没有,请根据虚拟机类型安装python3。比如ubuntu使用命令 sudo apt-get install python3即可。
  3. 安装crossenv:pip3 install crossenv
  4. 使用crossenv代表arm-python的虚拟环境:python3 -m crossenv --without-pip /home/book/arm-python/bin/python3 cross_venv
  5. cd cross_venv/cross/bin
  6. 激活虚拟环境:source activate
  7. 下载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。
  8. ./python3 get-pip.py
  9. 在cross_venv这个虚拟环境中的安装Cython:./pip3 install Cython
  10. 创建requestments.txt:vi requirements.txt, 里面写上numpy及版本号,这里我下载的版本是1.13.3,所以就写:
    在这里插入图片描述
  11. 交叉编译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
  1. 结果:
    在这里插入图片描述
  2. 注意,这里我们使用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开发板

  1. 将numpy-1.13.3-cp36-cp36m-linux_armv7l.whl移植到目录/home/book/arm-python/bin下。因为我交叉编译的python在开发板的目录是/home/book/arm-python/bin。请对照修改为自己的目录。
  2. 下载pip3:./curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py -k
  3. 安装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
  4. 验证pip3:./pip3 list
    在这里插入图片描述
  5. 安装numpy:./pip3 install numpy-1.13.3-cp36-cp36m-linux_armv7l.whl -i http://pypi.douban.com/simple --trusted-host pypi.douban.com。
    :如果不想每次安装都指定镜像源,可以参考博客https://blog.csdn.net/qq591840685/article/details/116399374创建pip.conf文件指定镜像源。
  6. 验证numpy:
    在这里插入图片描述

五、参考文章链接

  1. 使用pip报错:Could not fetch URL https://pypi.org/simple/selenium/: There was a problem confirming the ss
  2. curl 交叉编译
  3. 【Python笔记】如何编译不依赖lapack和atlas库的NumPy包
  4. python及第三方库交叉编译

猜你喜欢

转载自blog.csdn.net/m0_43443861/article/details/128526455
今日推荐