python3.8移植arm及裁剪
1 源码下载和编译
python官网下载地址:https://www.python.org/downloads/
python拥有众多库,可以快速搭建各种需要场景的解决方案。本次移植就是为了满足这样需要,可以快速将安装python库,实现在arm系统轻松玩转python。当然python有着本身的一些缺点,并不太推荐在arm系统使用,当然一切以需求为准,有时候为了快速搭建工程也不失为一种方案。
1.1 依赖库安装
zlib必备安装库
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -xvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
CC=arm-linux-gnueabihf-gcc ./configure --prefix=$HOME/my_python/install/arm/
make && make install
openssl对于需要用到https场景需要安装该库
wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1d.tar.gz
tar -xvf OpenSSL_1_1_1d.tar.gz
cd openssl-OpenSSL_1_1_1d/
./config no-asm --prefix=$HOME/my_python/install/arm/ --cross-compile-prefix=arm-linux-gnueabihf-
#这里主要解决报错:error: unrecognized command line option ‘-m64’
vi Makefile
#删除 -m64
make && make install
libffi对于需要用到_ctypes模块需要安装该库
wget https://github.com/libffi/libffi/archive/refs/tags/v3.2.1.tar.gz
tar -xvf libffi-3.2.1.tar.gz
cd libffi-3.2.1/
CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux-gnueabihf --prefix=$HOME/my_python/install/arm/
make && make install
1.2 python3.8.6安装
#虚拟机直接下载
wget https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tgz
tar -xvf Python-3.8.6.tgz
cd Python-3.8.6/
1.开启zlib依赖
>vi Modules/Setup
>#开放这一句
>zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
2.开启openssl依赖
vi Modules/Setup
#开放这一句
SSL=$(prefix)
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
3. 开启libffi依赖
export PKG_CONFIG_PATH=/home/my_python/install/arm/lib/pkgconfig:$PKG_CONFIG_PATH
4. 编译
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
STRIP=arm-linux-gnueabihf-strip \
./configure --host=arm-linux-gnueabihf --prefix=$HOME/my_python/install/arm/ \
--build=x86_64-linux-gnu \
--with-system-ffi \
--disable-ipv6 \
ac_cv_file__dev_ptmx=no \
ac_cv_file__dev_ptc=no
make -j 4 && make install
2 python库添加
arm系统安装python没办法直接利用pip进行库安装,这时候需要利用虚拟机上进行pc的库安装将安装好的库移植的lib目录下。
具体安装目录:
#将需要安装的库复制到site-packages目录下即可
lib\python3.8\site-packages
#目前移植库包括:
urllib3、requests、paho、dns、Crypto、chardet、aiohttp、pyotp、certifi、cffi、jinja2、yarl、yaml等等
3 python库裁剪
3.1 查看库依赖关系
1. 查看依赖关系:可以用ldd或者objdump
objdump -x bin/python3.8 | grep NEEDED
NEEDED libcrypt.so.1
NEEDED libpthread.so.0
NEEDED libdl.so.2
NEEDED libutil.so.1
NEEDED libm.so.6
NEEDED libssl.so.1.1
NEEDED libcrypto.so.1.1
NEEDED libz.so.1
NEEDED libc.so.6
查看目录中flash占用情况寻找需要裁剪的点:
du -lh --max-depth=1
#主要需要裁剪的点就是lib目录
175M ./lib
96K ./share
16M ./bin
4.2M ./include
195M .
2.根据结果移除多余库:
#移除多余的静态库
rm lib/libpython3.8.a
rm lib/libz.a
3. 利用strip裁剪
arm-linux-gnueabihf-strip bin/python3.8
cd lib/
arm-linux-gnueabihf-strip *
cd lib/python3.8/lib-dynload
arm-linux-gnueabihf-strip *
cd lib/python3.8/config-3.8-arm-linux-gnueabihf
4. 移除test目录
rm lib/python3.8/test
4 问题集
4.1 报错:configure: error: python3.8 interpreter not found
#先在本地安装python:
./configure --prefix=$HOME/my_python/install/pc/ --with-system-ffi
make -j 4 && make install
ln -s $HOME/my_python/install/pc/bin/python3.8 /usr/bin/python3
#记得清理,不然会不行文件格式不匹配的报错
make clean
4.2 报错:subprocess.CalledProcessError: Command ‘(‘lsb_release’, ‘-a’)’ returned non-zero exit status 1.
sudo find / -name lsb_release
rm /usr/bin/lsb_release
4.3 #报错:ModuleNotFoundError: No module named ‘_ctypes’
需要安装libffi库:见依赖库安装
4.4 #报错:SSL: CERTIFICATE_VERIFY_FAILED
#Ubuntu下载证书:
sudo update-ca-certificates --fresh
#放到对应目录,添加查找路径
export SSL_CERT_DIR=/mnt/python3.8.6/certs
#验证代码
import requests
r = requests.get('https://www.12306.cn')
print(r)