Android 平台的Python——第三方库移植

Android 平台的Python——基础篇(一)
Android 平台的Python——JNI方案(二)
Android 平台的Python——CLE方案实现(三)
Android 平台的Python——第三方库移植
Android 平台的Python——编译Python解释器
新篇——Android与Python混合编程

之前一段时间一直比较忙,导致很多想研究想写的博客没写,现在有时间正好补充一篇。前面写了三篇关于将Python3嵌入Android项目的博客,后来一直有人留言问怎么移植Python的第三方库,包括说调用标准库报错等等问题,我之前一直以为这些是Python的基本常识,没想到很多人都不知道。之前的三篇博客,大概是写给会一点Python的Android工程师看的,并不是完全定位写给小白看,这样一来我会默认看客已经知道哪些知识,很多细节没有详细解释,另一方面,我写博客的初衷是对自己知识的一个整理,等于是写给自己看的笔记。但是从另一个角度讲,最好的学习方法是把自己学会的知识立刻教授他人,这就是所谓的学习金字塔原理,有兴趣的人可以去了解学习金字塔。那么以后写博客,我会尽可能关注到一些细节,提升博客的水准,这也是对自己的一个升华提高。

Python 的模块加载路径

在讲库移植之前,先提下Python的基础知识,当我们自己编写了一个好用的库时,我们希望每次创建Python工程时都可以引入这个库,那么最简单的办法就是把它拷贝到Python标准库的路径下,但是不建议这样做,弄脏了标准库的目录,更好的做法是放到Python第三方库路径下,作为一个第三方库引入工程。这个路径是
...\python\Lib\site-packages
路径中的python就是你安装的Python的根目录。说到这里,其实就引出了另一个话题,Python的模块加载路径,我们可以在解释器中输出这个路径

import sys
print(sys.path)

以上代码输出的是一个列表,列表里面就是Python解释器去搜索模块的路径,一个一个去找,最后还是找不到,就会报错,说没有这个模块。知道了这一点,我们只需要修改这个列表,把我们自己写的模块的路径加到这个搜索列表,这样就可以成功引入我们自己编写的模块了。这种方法解决了一个问题,就是我想引入某个模块,这个模块或者是我们自己写的或者是从网上下载的某个库源码,但我不想把这些源码拷贝到Python解释器的库路径下面,而是存放在某个目录,更方便管理,比如是个git库目录,这个时候我们就可以在脚本的开始加上以下代码,动态将源码路径添加到Python模块搜索路径列表中

import sys
sys.path.append("my code path")

CLE框架下导入Python第三方库

前面的博客已经讲过了怎么使用CLE框架,在Android项目中嵌入Python解释器,但是有一些细节,很多人还不清楚

  • Android 工程的libs目录中放的libpython3.4m.so是什么?
    要回答这个问题,首先要了解Python解释器的源码结构。Python解释器源码可以从官网下载,也可以从Github上下载 Python解释器源码
    在这里插入图片描述
    划去一些无关的内容,具体说一下结构
    • Include:包含Python提供的所有头文件,如果需要自己使用C/C++编写自定义模块扩展Python,就需要用到这些头文件
    • Lib: 由Python语言编写的所有标准库
    • Modules:包含了标准库中所有使用C语言编写的模块
    • Parser:对Python代码进行词法分析和语法分析的部分
    • Objects:所有Python的内建对象
    • Python:Python运行的核心。解释器中的Compiler和执行引擎部分
      如果对源码学习感兴趣,推荐一本书《Python源码剖析》,看过之后会受益匪浅,特别是对想自己改写Python解释器的人

那么回到我们的话题,libpython3.4m.so实际上只是Parser、Objects、Python以及一小部分Modules编译出来的动态库,只是提供了Python解释器的核心功能。如有时间,在以后的博客,我会详细讲解,如何手动用NDK,使用Android.mk文件以及Makefile文件,分别在Windows系统和Ubuntu系统上交叉编译出完整的在Android上运行的Python so库。

  • 为什么使用CLE框架集成Python解释器后,有些标准库报找不到错误?
    看博客不细心的人,可能没有注意到一张图,这里面放的so是什么?
    在这里插入图片描述
    我们打开下载的CLE文件starcore_for_android.2.6.0,进入里面的python.files目录下面,一路下去找到一个叫lib-dynload的目录
    在这里插入图片描述
    可以看到,里面放了一堆so库,这个就是上文讲的Modules里面编译出来的Python标准库,这些Python的标准库都是用C语言写的,CLE框架中,将Modules里面的标准库模块都编译成了一个个小的so,这样做的好处就是可以按需集成,我们知道Android的Apk文件都是要尽可能小的,你没有用到的模块,可以不用集成到apk中,否则全部打包到libpython.so中,无端增加了apk大小。

好了,到此铺垫都讲完了。现在具体谈一下装载Python库的思路

  1. 将需要的Python库打包到工程的assets目录下,在适当的时候,将assets目录下的文件都拷贝到手机存储中,这个存储可以是sdcard,也可以是内部的/data/data/package-name下
  2. 在需要引入这些库的时候,使用我们一开始讲的方法,将路径添加到Python的模块搜索列表——sys.path列表,让解释器能搜索到它们。

下面我们以一个实例来具体说明,这次我们需要移植的是爬虫需要用到的两个库,requests和BeautifulSoup,有了这两个库,我们瞬间就能将废旧的Android手机制作成Python爬虫机,老机器焕发新生命,怎么样激不激动?

1.打包库

如果我们本地Python环境中已经安装了这些库,可以直接去Python的库目录打包,因为这些库基本是纯Python代码,是跨平台的,当然,别把Python2.x和Python3.x搞混。如果没有安装,去相关的官网下载它们的源码打包。

  • 60
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程之路从0到1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值