移植Python2.7.3到嵌入式Linux平台——HI3531DV100

Python2与Python3二者是不兼容的,因此做两个版本来说明,先从Python2开始,网上用得比较多的Python2当属2.7.3了

硬件信息

  • 编译服务器版本:Ubuntu 12.04.5 LTS
  • 交叉编译器:arm-hisiv600-linux-
  • 硬件平台:HI3531DV100

源码下载&解压

  1. wget https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.xz
  2. xz -d Python-2.7.3.tar.xz
  3. tar xvf Python-2.7.3.tar

编译HOST解释器

编译Python的嵌入式版,需要解释器解析setup.py从而编译Python的模块,因此需要先编译出HOST的解释器

  1. cd Python-2.7.3/
  2. ./configure
  3. make python Parser/pgen
  4. mv python hostpython
  5. mv Parser/pgen Parser/hostpgen
  6. make distclean

打交叉编译补丁

下载补丁文件,并把它放进Python-2.7.3目录

https://github.com/sjkingo/python27-arm-xcompile/blob/master/files/Python-2.7.3-xcompile.patch

  1. patch -p1 < Python-2.7.3-xcompile.patch

配置交叉编译工具链

设置交叉编译工具链为arm-hisiv600-linux,编译生成的可执行文件存放目录为当前目录的_install文件夹

  1. ./configure --host=arm-hisiv600-linux --prefix=$PWD/_install

编译&安装

  1. make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-hisiv600-linux-gcc -shared" CROSS_COMPILE=arm-hisiv600-linux- CROSS_COMPILE_TARGET=yes

    这一步提示编译已完成,但发现缺失很多模块,这些缺失的模块会导致运行python后,import sqlite3,ssl,zlib等失败
    在这里插入图片描述

    在此,我先跳过,后面再细讲如何解决这种问题,继续执行下面的步骤

  2. make install HOSTPYTHON=./hostpython BLDSHARED="arm-hisiv600-linux-gcc -shared" CROSS_COMPILE=arm-hisiv600-linux- CROSS_COMPILE_TARGET=yes prefix=$PWD/_install

执行完以上两个命令之后在_install中会产生bin lib include share 4个文件夹

目标板文件拷贝

现将_install整个文件夹,拷贝到ARM目标板的文件系统中,随意位置

注意:_install/include中的头文件也是需要的,因为某些头文件是Python环境所需要的,比如Python解释器启动依赖于pyconfig.h

我这里是通过nfs挂载到目标板的,因为目标板的Flash容量有限

验证目标板Python

在目标板上执行

  1. cd ***/python/Python-2.7.3/_install/bin

  2. ./python

写几行代码,测试一下,此时import zlib会提示找不到,后续解决
在这里插入图片描述

测试结果符合预期!

解决模块缺失

在与Python-2.7.3同级目录下,新建一个python_deps的文件夹,用来存放Python的外部依赖

zlib

最容易想到要加进来的lib库就是zlib了

  1. wget http://www.zlib.net/fossils/zlib-1.2.5.tar.gz

  2. tar -zxf zlib-1.2.5.tar.gz

  3. cd zlib-1.2.5/

  4. ./configure --prefix=/home/xxx/board_nfs/python/python_deps

  5. vi Makefile,修改第19/30/31/39/40/41行,改为arm-hisiv600-linux-交叉编译工具链

  6. make

  7. make install

libffi

看patch文件,看到需要libffi-3.0.10,所以这里也把该lib一起加进来
在这里插入图片描述

  1. wget ftp://sourceware.org/pub/libffi/libffi-3.0.10.tar.gz

  2. tar -zxf libffi-3.0.10.tar.gz

  3. cd libffi-3.0.10/

  4. ./configure --host=arm-hisiv600-linux --prefix=/home/xxx/board_nfs/python/python_deps

  5. make

  6. make install

再看patch文件,得知在make编译时需要带PYTHON_XCOMPILE_DEPENDENCIES_PREFIX这个参数,指定外部头文件和库文件所在的路径,即

  1. make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-hisiv600-linux-gcc -shared" CROSS_COMPILE=arm-hisiv600-linux- CROSS_COMPILE_TARGET=yes PYTHON_XCOMPILE_DEPENDENCIES_PREFIX=$PWD/../python_deps

这一步之后,你会发现缺失模块列表里,就会少了zlib这一项了,说明编译期间已经找到zlib了
在这里插入图片描述

注意:make install这一步也要带上PYTHON_XCOMPILE_DEPENDENCIES_PREFIX参数

  1. make install HOSTPYTHON=./hostpython BLDSHARED="arm-hisiv600-linux-gcc -shared" CROSS_COMPILE=arm-hisiv600-linux- CROSS_COMPILE_TARGET=yes prefix=$PWD/_install PYTHON_XCOMPILE_DEPENDENCIES_PREFIX=$PWD/../python_deps

拷贝文件到目标板

  1. cp -rfp python_deps/lib/libz.so* Python-2.7.3/_install/lib/

  2. cp -rfp python_deps/lib/libffi.so* Python-2.7.3/_install/lib/

验证

  1. export LD_LIBRARY_PATH=/nfsroot/python/Python-2.7.3/_install/lib:$LD_LIBRARY_PATH

  2. cd python/Python-2.7.3/_install/bin/

  3. ./python

验证import zlib不会报错,说明OK了
在这里插入图片描述

sqlite3

搞清楚了套路之后,对于别的模块,也是用同样的方法

下载sqlite3.8.6版本

https://www.sqlite.org/cgi/src/tarball/9491ba7d/SQLite-9491ba7d.tar.gz

  1. tar -zxf SQLite-9491ba7d.tar.gz

  2. cd SQLite-9491ba7d/

  3. ./configure --host=arm-hisiv600-linux --prefix=/home/xxx/board_nfs/python/python_deps --enable-shared --disable-readline --disable-dynamic-extensions

  4. make

  5. make install

接着,同样在Python-2.7.3目录,执行下面两个命令

  1. make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-hisiv600-linux-gcc -shared" CROSS_COMPILE=arm-hisiv600-linux- CROSS_COMPILE_TARGET=yes PYTHON_XCOMPILE_DEPENDENCIES_PREFIX=$PWD/../python_deps
  2. make install HOSTPYTHON=./hostpython BLDSHARED="arm-hisiv600-linux-gcc -shared" CROSS_COMPILE=arm-hisiv600-linux- CROSS_COMPILE_TARGET=yes prefix=$PWD/_install PYTHON_XCOMPILE_DEPENDENCIES_PREFIX=$PWD/../python_deps

这一步之后,你会发现缺失模块列表里,就会少了_sqlite3这一项了,说明编译期间已经找到sqlite3了
在这里插入图片描述

拷贝文件到目标板

  1. cp -rfp python_deps/lib/libsqlite3.so* Python-2.7.3/_install/l
    ib/

验证

  1. export LD_LIBRARY_PATH=/nfsroot/python/Python-2.7.3/_install/lib:$LD_LIBRARY_PATH

  2. cd python/Python-2.7.3/_install/bin/

  3. ./python

验证import sqlite3不会报错,说明OK了
在这里插入图片描述

剩下其它的模块,可视情况根据需要自己去下载源码包交叉编译即可!

参考

  1. https://www.pianshen.com/article/5190888143/
  2. https://www.cnblogs.com/hit-python/articles/4079506.html
  3. https://www.cnblogs.com/hit-python/articles/4081673.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cfl927096306

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值