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)
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值