Python3 交叉编译 numpy pandas scipy scikit-learn

news2024/9/20 9:45:53

1. 概述

由于需要将Python3.7 和一些软件包交叉编译到 armv7 平台硬件,如果是arm64位的系统,很多包都有预编译好的版本,可直接下载。本文主要在基于 crossenv(https://github.com/benfogle/crossenv)环境下交叉编译。

2. 编译环境搭建

  • 创建编译环境路径 /home/ym/python-build,创建 /home/ym/python-build/install路径用于安装主机编译后的python, 创建路径/home/ym/python-build/install-arm用于安装交叉编译的python。
  • 下载python3 源码到 home/ym/python-build, 并解压,下载路径https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
  • 编译主机安装 Docker 环境,不同的linux发行版本安装方式不同, Debian -> apt, Redhat -> yum,我安装的版本是
    在这里插入图片描述
  • 在编译路径下创建一个 Dockerfile 文件:
FROM ubuntu:18.04                                                                                                          
ENV TZ=Asia/Shanghai
ENV LANG=en_US.UTF-8

RUN sed -i -e 's|archive.ubuntu.com|mirrors.tuna.tsinghua.edu.cn|g' \               
        -e 's|security.ubuntu.com|mirrors.tuna.tsinghua.edu.cn|g' \                    
        /etc/apt/sources.list            

RUN apt update && apt install -y vim curl proxchains gcc \                           
		build-essential crossbuild-essential-armhf \              
		libsdl1.2-dev xterm mesa-common-dev zstd liblz4-tool libffi-dev \  
		cmake libssl-dev bc device-tree-compiler flex bison libncurses-dev \
        lzma liblzma-dev libbz2-dev gfortran libopenblas-dev liblapack-dev \
        gfortran-arm-linux-gnueabihf

RUN rm -rf /etc/apt/apt.conf.d/docker-clean 

RUN mkdir -p /root/project                
WORKDIR /root   
CMD ["/bin/bash"]  
  • 基于 Dockerfile 构建容器
docker build -f Dockerfile -t ubuntu:python .
  • 运行容器,将编译路径python-build映射至容器路径/root/project路径下:
docker run -v /home/ym/python-build/:/root/project -it ubuntu:python

3. 编译主机版本 python

  • 进入python源码目录
./configure --prefix=/root/project/install && make && make install

4. 交叉编译目标板 python

  • 交叉编译 openssl
# Adapted from https://github.com/japaric/cross
set -ex

INSTALL_DIR=/root/project/openssl
mkdir -p $INSTALL_DIR
main() {

    local version=1.1.1l
    local os=linux-armv4
    local triple=arm-linux-gnueabihf-
    local sysroot=$INSTALL_DIR

    local dependencies=(
        ca-certificates
        curl
        m4
        make
        perl
    )

    # NOTE cross toolchain must be already installed
    apt-get update
    for dep in ${dependencies[@]}; do
        if ! dpkg -L $dep; then
            apt-get install --no-install-recommends -y $dep
        fi
    done

    td=$(mktemp -d)

    pushd $td
    [ -e ./openssl-$version.tar.gz ] || {
        curl -L https://www.openssl.org/source/openssl-$version.tar.gz -o ./openssl-$version.tar.gz
    }
    tar --strip-components 1 -xz -f ./openssl-$version.tar.gz

    AR=${triple}ar CC=${triple}gcc ./Configure \
      --prefix=${sysroot}/usr \
      --openssldir=${sysroot}/usr \
      shared \
      no-asm \
      $os \
      -fPIC \
      ${@:4}
    make -j$(nproc)
    make install_sw
    
    # clean up

    popd

    rm -rf $td
    #rm $0
	#cp /usr/local/arm/usr/lib/pkgconfig/* /usr/share/pkgconfig/

}

main "${@}"
  • 交叉编译 bzip2, zlib, lzma 这些包会被python内建模块识别调用,并被 pandas 所依赖,同时需要把 zlib, lzma的动态库拷贝到目标板内核库的路径下。
  • lzma 下载地址https://xz.tukaani.org/xz-utils/#releases
  • 交叉编译libffi, 该包与 python ctypes 模块关联,注意交叉编译完成后需要将安装后的内容拷贝到交叉工具链的路径下(cp -rfp libffi/* /usr/arm-linux-gnueabihf/),并在 Python 配置选项中指定--with-system-ffi参数,交叉编译时 Python 自动构建 ctypes 模块,测试发现通过 LIBS 变量指定不会生效。
  • 创建一个 config.site 文件:
ac_cv_file__dev_ptc=no
ac_cv_buggy_getaddrinfo=no
ac_cv_file__dev_ptmx=no
  • 清除 python 源码相关环境(make distclean),运行下面脚本交叉编译目标版本 python-target(armv7),安装到路径/root/project/install-arm
#!/bin/sh
CROSS_COMPILE=arm-linux-gnueabihf
export CC=$CROSS_COMPILE-gcc
export CXX=$CROSS_COMPILE-g++
export AR=$CROSS_COMPILE-ar
export STRIP=$CROSS_COMPILE-strip
export LD=$CROSS_COMPILE-ld
export RANLIB=$CROSS_COMPILE-ranlib
export READELF=$CROSS_COMPILE-readelf
export PATH=$PATH:/root/project/install/bin
export CONFIG_SITE=/root/project/config.site

cd Python-3.7.2 && ./configure --enable-optimizations --with-openssl=/root/project/openssl/usr --with-system-ffi \
        LDFLAGS="-L/root/project/bzip2-1.0.8 -L/root/project/zlib/lib -L/root/project/lzma/lib" \
        LIBS="-lbz2 -lz -llzma" \
        --host=arm-linux-gnueabihf \
        --build=x86_64-linux-gnu \
        --target=arm-linux-gnueabihf \
        --disable-ipv6 \
        --without-pydebug \
        --without-dtrace \
        --prefix=/root/project/install-arm
make -j4 && make install

到此如果编译过程中没有出错的话,交叉编译后的 python 应该可以直接在 目标板上工作了,在目标板上创建一个 python 目录,将 install-arm 中的文件全部拷贝至该路径中,构建一个软连接 ln -sf /python/bin/python3.7 /usr/bin/python,然后在控制运行 python 查看是否正常:
在这里插入图片描述

5. 通过 crossenv 交叉编译 numpy,pandas

  • 如果只是想交叉编译 numpy 或者 pandas, 看到这一小节就行了,其中pandas 依赖 numpy。如果还要编译其他包请用第六节脚本编译的方法交叉编译 numpy.
1. 在主机环境下安装 crossenv
   cd  /root/project/install/bin
   ./pip3 install crossenv
2. 使用crossenv创建 python-target 编译的虚拟环境
   ./python3 -m crossenv /root/project/install-arm/bin/python3.7 cross_venv
3. 激活虚拟环境
   . cross_venv/bin/activate
注意没有代理可使用国内镜像如 pip install xx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
4. 编译安装 numpy
   build-pip -v install numpy
   pip -v install numpy
5. 编译安装 pandas
   build-pip -v install pandas
   pip -v install pandas
注意pandas 依赖 dateutil,dateutil会使用目标板的时区信息,请检查目标板是否有 /usr/share/zoneinfo 和 /etc/localtime 文件,没有可能在导入 pandas 包时会报错,可将交叉编译后的 dateutil/zoneinfo/dateutil-zoneinfo.tar.gz 解压至 /usr/share/zoneinfo中,并创建软连接 ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
   编译成功后可在 cross_venv/cross/lib/pythonVERSION/site-packages 路径下查看编译完后的包
   其中包主要分两类:
   1). package -> 对应包的实际文件
   2). package-VERSION-dist-info -> 包的信息 
6. 将对应的 package 拷贝到目标板 path/to/python/lib/pythonVERSION/site-package 路径下

在这里插入图片描述

  • 这里导入包的时候,可能会报一些库文件缺失,需要把对应的库拷贝到目标板库/lib的路径下。

6. 通过 crossenv 交叉编译 scikit-learn

  • 这里先列一下依赖项
  • scikit-learn:
    • NumPy
    • SciPy :
      • NumPy
      • openblas
    • joblib
    • threadpoolctl
  • 由于 SciPy 强依赖 numpy 中 openblas 包,openblas 是一个数学运算库,可用于加速 numpy 运算,如果只是单纯编译 numpy,那么 openblas 是一个可选项,但是如果需要编译 SciPy,openblas 就是一个强依赖项了,但是 openblas 是由 Fortran 语言编写,直接用 crossenv 环境编译会报错,下面用一个脚本来交叉编译 numpy 和 SciPy,编译之前,先用交叉工具链编译 openblas,并在虚拟环境中 build-pip/pip安装 Cython < 3 版本:
1. 确认以下几个包已安装
	apt-get install gfortran libopenblas-dev liblapack-dev -y
2. 安装 fortran 交叉编译工具
	apt-get install gfortran-arm-linux-gnueabihf
3. 交叉编译 OpenBLAS-0.3.22
    cd OpenBLAS-0.3.22 && make TARGET=ARMV7 HOSTCC=gcc BINARY=32 CC=arm-linux-gnueabihf-gcc FC=arm-linux-gnueabihf-gfortran
    make TARGET=ARMV7 PREFIX=/root/project/openblas install
  • 交叉编译 scipy 脚本
#!/bin/bash

####################
# Script to build numpy and scipy wheels for ARM. 

set -ex

OUTPUT=$PWD/output
WORKING=$OUTPUT/build
if [ ! -d "$WORKING" ];then
	mkdir -p $WORKING
fi

GFORTRAN=arm-linux-gnueabihf-gfortran
OPENBLAS_INSTALL_DIR=$PWD/openblas

BUILD_PYTHON=$PWD/install/bin/python3
HOST_PYTHON=$PWD/install-arm/bin/python3

NUMPY_URL=https://files.pythonhosted.org/packages/45/b7/de7b8e67f2232c26af57c205aaad29fe17754f793404f59c8a730c7a191a/numpy-1.21.6.zip
SCIPY_URL=https://files.pythonhosted.org/packages/a7/5c/495190b8c7cc71977c3d3fafe788d99d43eeb4740ac56856095df6a23fbd/scipy-1.3.3.tar.gz
NUMPY_VERSION=${NUMPY_URL##*/}
if [[ $NUMPY_VERSION =~ .zip* ]];then
      NUMPY_DIR=${NUMPY_VERSION%%.zip*}
elif [[ $NUMPY_VERSION =~ .tar.gz* ]];then
      NUMPY_DIR=${NUMPY_VERSION%%.tar.gz*}
fi
SCIPY_VERSION=${SCIPY_URL##*/}
SCIPY_DIR=${SCIPY_VERSION%%.tar.gz*}

PYPI_MIRROR="-i http://pypi.douban.com/simple --trusted-host pypi.douban.com"
################################################################
# Set up crossenv
$BUILD_PYTHON -m pip install crossenv
CROSS_VENV=$PWD/install/bin/cross_venv
if [ ! -d "$CROSS_VENV" ];then
    $BUILD_PYTHON -m crossenv $HOST_PYTHON $CROSS_VENV
fi
. $CROSS_VENV/bin/activate
pip install wheel $PYPI_MIRROR

BUILD_SITE=$PWD/install/bin/cross_venv/build/lib/python3.7/site-packages
CROSS_SITE=$PWD/install/bin/cross_venv/cross/lib/python3.7/site-packages

################################################################
# Host-numpy
# Install so we get the libnpymath.a in the right place.
if [ ! -f "$NUMPY_VERSION" ];then
    curl -OL $NUMPY_URL
fi
if [ ! -d "$NUMPY_DIR" ];then
    if [[ $NUMPY_VERSION =~ .zip* ]];then
       unzip $NUMPY_VERSION
    elif [[ $NUMPY_VERSION =~ .tar.gz* ]];then 
       tar xf $NUMPY_VERSION
    fi
fi
cd $NUMPY_DIR
cat > site.cfg <<EOF
[openblas]
libraries = openblas
library_dirs = $OPENBLAS_INSTALL_DIR/lib
include_dirs = $OPENBLAS_INSTALL_DIR/include
extra_link_args = -lgfortran
EOF
F90=$GFORTRAN cross-python setup.py install
F90=$GFORTRAN cross-python setup.py bdist_wheel
cd ..

################################################################
# Build-numpy. Need to patch _after_ install.
NUMPY_PIP_VERSION=${NUMPY_DIR##*-}
build-pip install -v numpy==$NUMPY_PIP_VERSION $PYPI_MIRROR
INI=$(find $BUILD_SITE -name 'npymath.ini')
LIBDIR=$(find $CROSS_SITE -path '*/numpy/core/lib')
INCDIR=$(find $CROSS_SITE -path '*/numpy/core/include')

cat > $INI <<EOF
[meta]
Name=npymath
Description=Portable, core math library implementing C99 standard
Version=0.1

[variables]
# Force it to find cross-build libs when we build scipy
libdir=$LIBDIR
includedir=$INCDIR

[default]
Libs=-L\${libdir} -lnpymath
Cflags=-I\${includedir}
Requires=mlib

[msvc]
Libs=/LIBPATH:\${libdir} npymath.lib
Cflags=/INCLUDE:\${includedir}
Requires=mlib
EOF


#################################################################
# host-scipy
if [ ! -f "$SCIPY_VERSION" ];then
   curl -OL $SCIPY_URL
fi
if [ ! -d "$SCIPY_DIR" ];then
   tar xf $SCIPY_VERSION
fi
cd $SCIPY_DIR
cat > site.cfg <<EOF
[openblas]
libraries = openblas
library_dirs = $OPENBLAS_INSTALL_DIR/lib
include_dirs = $OPENBLAS_INSTALL_DIR/include
extra_link_args = -lgfortran
EOF

F90=$GFORTRAN python setup.py bdist_wheel
F90=$GFORTRAN cross-python setup.py install
cd ..
  • 交叉编译 scikit-learn: :
  • SciPy -> 先前利用脚本已经完成了交叉编译,现在使用 build-pip 安装 build 版本:
build-pip install -v scipy=1.3.3 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • joblib -> build-pip/pip 直接安装没有其他依赖
build-pip install joblib==0.11 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install joblib==0.11 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • threadpoolctl -> build-pip/pip 直接安装没有其他依赖
build-pip install threadpoolctl==2.0.0 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install threadpoolctl==2.0.0 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • 安装 scikit-learn:
build-pip install -v scikit-learn==1.0.2 --no-build-isolation -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install -v scikit-learn==1.0.2 --no-build-isolation -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

至此交叉编译全部完成,将对应的包拷贝到目标板查看
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

处理SERVLET中的错误

处理SERVLET中的错误 问题陈述 一位用户在使用在线计算机应用程序时输入一个非数字字符做数字加法。servlet试图将用户输入的值转换成整数型时,引发了NumberFormException类型的异常。要创建一个Web应用程序来使用自定义错误页面处理该异常。该自定义错误页面需要向用户提供关…

【原创】点火线圈项目

一、项目介绍 此点火线圈项目主要实现对各部件的自动组装、测试、以及下料。 二、各个工位实现动作流程 1、合装移载位,这个工位通过伺服电机和气缸夹爪把上游设备加工的点火线圈插头移载到合装位。 通过伺服设置抓料位置(绝对定位)伺服电机到了抓料位后伸出气缸伸出,夹…

acwing869. 试除法求约数870. 约数个数AcWing871. 约数之和872. 最大公约数

869. 试除法求约数 思路&#xff1a; 约数和质数的求解有着共性&#xff0c; 就是都是使用 for (int i 1; i < n/i; i) 进行计算的。这样的原因是因为约数必然也是两两一组&#xff0c; 那么我们求出小的自然也就知道另一个&#xff0c;只要再判断一下n/i和i是否相同&a…

Qt PCL学习(一):环境搭建

参考 (QT配置pcl)PCL1.12.1QT5.15.2vs2019cmake3.22.4vtk9.1.0visual studio2019Qt5.15.2PCL1.12.1vtk9.1.0cmake3.22.2 本博客用到的所有资源 版本一览&#xff1a;Visual Studio 2019 Qt 5.15.2 PCL 1.12.1 VTK 9.1.0https://pan.baidu.com/s/1xW7xCdR5QzgS1_d1NeIZpQ?pw…

队列---数据结构

定义 队列&#xff08;Queue&#xff09;简称队&#xff0c;也是一种操作受限的线性表&#xff0c;只允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素称为入队或进队&#xff1b;删除元素称为出队或离队。 队头&#xff08;Front&#xff09;&a…

小米平板6获取root权限教程

1. 绑定账号 1> 打开"设置-我的设备-全部参数-连续点击MIUI版本按钮"&#xff0c;直到提示已打开开发者模式( p s : 这里需要重点关注红框平板型号和 M I U I 版本&#xff0c;例如我这里平板型号是 X i a o m i P a d 6 &#xff0c; M I U I 版本是 14.0.10 &am…

3 编辑器(Vim)

1.完成 vimtutor。备注&#xff1a;它在一个 80x24&#xff08;80 列&#xff0c;24 行&#xff09; 终端窗口看起来效果最好。 2.下载我们提供的 vimrc&#xff0c;然后把它保存到 ~/.vimrc。 通读这个注释详细的文件 &#xff08;用 Vim!&#xff09;&#xff0c; 然后观察 …

MySQL数据库①_MySQL入门(概念+使用)

目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库&#xff0c;服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…

智能决策的艺术:探索商业分析的最佳工具和方法

文章目录 一、引言二、商业分析思维概述三、数据分析在商业实践中的应用四、如何培养商业分析思维与实践能力五、结论《商业分析思维与实践&#xff1a;用数据分析解决商业问题》亮点内容简介作者简介目录获取方式 一、引言 随着大数据时代的来临&#xff0c;商业分析思维与实…

Cox等级资料是个坑

R语言做&#xff01;初学者先进来看看&#xff01;&#xff01;&#xff01; SCI冲 COX多因素模型需要满足的条件&#xff1a; 1.各观测值间相互独立&#xff0c;即残差之间不存在自相关&#xff1b; 2.因变量和自变量之间存在线性关系&#xff1b; 3.残差的方差齐&#xf…

蓝桥杯备战——12.超声波与测频代码优化

1.优化分析 昨天我在看原理图的发现超声波模块的反馈引脚P11刚好可以使用PCA模块0的捕获功能&#xff0c;我就想着把PCA功能留给超声波&#xff0c;然后测频功能还是改成定时器0来完成&#xff0c;然后前后台功能改成定时器1。 至于我为什么要这么改呢&#xff0c;看一下我原…

【2024美赛】C题 Problem C: Momentum in Tennis网球运动中的势头 网球问题一python代码

相关链接 &#xff08;1&#xff09;问题分析 &#xff08;2&#xff09;26页论文 1 题目 http://t.csdnimg.cn/BzhFu 2 问题一数学模型 采用隐马尔可夫模型&#xff08;Markov Model&#xff09;&#xff0c;这是一种描述随机过程的数学模型&#xff0c;它满足马尔可夫性…

Powershell Install 一键部署Prometheus

前言 Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上…

redis 6.x集群搭建

redis6集群搭建 安装文件下载 redis-6.2.6.tar.gz 编译 tar -zxvf redis-6.2.6.tar.gz cd redis-6.2.6/ make MALLOClibc make install PREFIX/opt/soft/redis复制可执行文件 cp /opt/soft/redis/redis-cli /usr/bin/redis-cli cp /opt/soft/redis/redis-server /usr/bi…

ffmpeg操作实战001:视频+音频文件融合

一、功能需求 把视频文件video.mp4 和音频文件audio.wav融合在一起&#xff0c;输出视频文件output.mp4 二、操作指令 ffmpeg -i video.mp4 -i audio.wav -c:v copy -map 0:v:0 -map 1:a:0 output.mp4 三、参数说明 ffmpeg: 这是用于执行FFmpeg命令行工具的命令。-i video…

数据结构(C语言)代码实现(六)——单链表的实现

目录 参考、格式 头文件LinkList.h 一、将函数的小括号写成中括号 二、读取权限冲突 三、L->Last指针没有移动 四、函数指针的使用 头文件完整代码 测试函数&#xff08;主函数&#xff09;test.cpp 测试结果 参考、格式 数据结构课本2.3节&#xff08;严蔚敏版&a…

虚幻UE5Matehuman定制自己的虚拟人,从相机拍照到UE5制作全流程

开启自己的元宇宙,照片扫描真实的人类,生成虚拟形象,保姆级教程,欢迎大家指正。 需要的软件: 制作流程: 一.拍照。 围绕自己拍照,大概20多张图就差不多了,把脑门漏出来,无需拍后脑勺。 拍照方式 例如,拍照时尽量不要在脸上体现出明显的光源方向。

如何在Shopee平台上进行测款选品

在如今竞争激烈的电商市场&#xff0c;选择合适的产品成为卖家们提高销售业绩的重要一环。在Shopee平台上进行测款选品&#xff0c;可以帮助卖家找到符合市场需求的产品&#xff0c;提高销售业绩。本文将介绍一些策略和步骤&#xff0c;帮助卖家在Shopee平台上进行测款选品。 …

PCL安装以及CGAL构建三维凸包

基础理论专栏目录 - 知乎 (zhihu.com) 凸包问题——概述 - 知乎 (zhihu.com) 1、安装PCL 安装pcl,我的是window10,vs2019。我安装的是1.13 win10系统下 VS2019点云库PCL1.12.0的安装与配置_windows 10使用pcl-CSDN博客 照着上述博客进行配置&#xff0c;再结合这个设置环境变…

LeAPI 后端接口开发 - 发布、下线接口

一、上线接口&#xff08;仅管理员&#xff09; 1. 校验请求参数 2. 判断&#xff08;测试&#xff09;接口是否可以调用 引入调用接口的客户端&#xff08;自己写的 SDK&#xff09;注入客户端实例调用接口 3. 修改数据库中接口的状态 /*** 上线&#xff08;发布&#xff…