Python2与Python3二者是不兼容的,因此做两个版本来说明,先从Python2开始,网上用得比较多的Python2当属2.7.3了
硬件信息
- 编译服务器版本:Ubuntu 12.04.5 LTS
- 交叉编译器:arm-hisiv600-linux-
- 硬件平台:HI3531DV100
源码下载&解压
wget https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.xz
xz -d Python-2.7.3.tar.xz
tar xvf Python-2.7.3.tar
编译HOST解释器
编译Python的嵌入式版,需要解释器解析setup.py从而编译Python的模块,因此需要先编译出HOST的解释器
cd Python-2.7.3/
./configure
make python Parser/pgen
mv python hostpython
mv Parser/pgen Parser/hostpgen
make distclean
打交叉编译补丁
下载补丁文件,并把它放进Python-2.7.3目录
https://github.com/sjkingo/python27-arm-xcompile/blob/master/files/Python-2.7.3-xcompile.patch
patch -p1 < Python-2.7.3-xcompile.patch
配置交叉编译工具链
设置交叉编译工具链为arm-hisiv600-linux,编译生成的可执行文件存放目录为当前目录的_install文件夹
./configure --host=arm-hisiv600-linux --prefix=$PWD/_install
编译&安装
-
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等失败
在此,我先跳过,后面再细讲如何解决这种问题,继续执行下面的步骤
-
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
在目标板上执行
-
cd ***/python/Python-2.7.3/_install/bin
-
./python
写几行代码,测试一下,此时import zlib会提示找不到,后续解决
测试结果符合预期!
解决模块缺失
在与Python-2.7.3同级目录下,新建一个python_deps的文件夹,用来存放Python的外部依赖
zlib
最容易想到要加进来的lib库就是zlib了
-
wget http://www.zlib.net/fossils/zlib-1.2.5.tar.gz
-
tar -zxf zlib-1.2.5.tar.gz
-
cd zlib-1.2.5/
-
./configure --prefix=/home/xxx/board_nfs/python/python_deps
-
vi Makefile
,修改第19/30/31/39/40/41行,改为arm-hisiv600-linux-交叉编译工具链 -
make
-
make install
libffi
看patch文件,看到需要libffi-3.0.10,所以这里也把该lib一起加进来
-
wget ftp://sourceware.org/pub/libffi/libffi-3.0.10.tar.gz
-
tar -zxf libffi-3.0.10.tar.gz
-
cd libffi-3.0.10/
-
./configure --host=arm-hisiv600-linux --prefix=/home/xxx/board_nfs/python/python_deps
-
make
-
make install
再看patch文件,得知在make编译时需要带PYTHON_XCOMPILE_DEPENDENCIES_PREFIX
这个参数,指定外部头文件和库文件所在的路径,即
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
参数
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
拷贝文件到目标板
-
cp -rfp python_deps/lib/libz.so* Python-2.7.3/_install/lib/
-
cp -rfp python_deps/lib/libffi.so* Python-2.7.3/_install/lib/
验证
-
export LD_LIBRARY_PATH=/nfsroot/python/Python-2.7.3/_install/lib:$LD_LIBRARY_PATH
-
cd python/Python-2.7.3/_install/bin/
-
./python
验证import zlib不会报错,说明OK了
sqlite3
搞清楚了套路之后,对于别的模块,也是用同样的方法
下载sqlite3.8.6版本
https://www.sqlite.org/cgi/src/tarball/9491ba7d/SQLite-9491ba7d.tar.gz
-
tar -zxf SQLite-9491ba7d.tar.gz
-
cd SQLite-9491ba7d/
-
./configure --host=arm-hisiv600-linux --prefix=/home/xxx/board_nfs/python/python_deps --enable-shared --disable-readline --disable-dynamic-extensions
-
make
-
make install
接着,同样在Python-2.7.3目录,执行下面两个命令
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
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了
拷贝文件到目标板
cp -rfp python_deps/lib/libsqlite3.so* Python-2.7.3/_install/l
ib/
验证
-
export LD_LIBRARY_PATH=/nfsroot/python/Python-2.7.3/_install/lib:$LD_LIBRARY_PATH
-
cd python/Python-2.7.3/_install/bin/
-
./python
验证import sqlite3不会报错,说明OK了
剩下其它的模块,可视情况根据需要自己去下载源码包交叉编译即可!