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

本文详细介绍了如何在Android平台上移植Python第三方库,包括理解Python的模块加载路径,使用CLE框架导入库,以及在Crytax-NDK的Python环境中集成第三方库。通过实例演示了requests和BeautifulSoup库的移植过程,强调了正确打包和添加搜索路径的重要性,同时指出了Crytax-NDK集成中遇到的SSL问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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搞混。如果没有安装,去相关的官网下载它们的源码打包。
在这里插入图片描述
在这里插入图片描述

很多人可能不知道,Python本身就是支持导入zip格式的包的,不信的同学可以自己在本地实验一下,将自己写的库压缩为zip,然后依然可以愉快的import。以上包中,python3.5.zip是纯Python代码的标准库,在CLE里面已经提供了,唯一需要说明的地方,是certifi库为什么没有打包,而是以目录形式提供呢?这里也正是我采坑的地方,之前试验一直报错没有成功移植requests库,就是因为打包了certifi,后来反复测试定位到该包,发现里面有一个cacert.pem文件,不是.py文件,在压缩包中无法被读取,因此只能以文件夹形式提供了。
另外还有一个小点说一下,相信绝大部分人不会犯错,但总有粗心大意的。打包的时候,要打包这个库的源码父目录,就像certifi一样,是打包这个certifi目录,而不是进到certifi里面,选中所有文件

### Chaquopy 对 Python 的支持 Chaquopy 是一种用于在 Android 应用程序中集成 Python 的工具,它允许开发者利用 Python 脚本的强大功能来增强应用程序的功能[^1]。关于 Chaquopy 是否支持使用 Python 的问题,以下是详细的说明: #### 1. **官方文档中的支持** 根据 Chaquopy 的官方文档描述,该工具支持大多数纯 Python以及部分依赖 C 扩展的。对于那些需要编译本地代码的(例如 NumPy 或 SciPy),Chaquopy 提供了一种机制来预编译这些扩展并将其打包到 APK 文件中[^2]。 #### 2. **具体支持范围** - **纯 Python **:任何仅由 Python 代码组成的都可以直接通过 `requirements.txt` 进行配置,并自动下载和安装。 - **带 C 扩展的**:如果某个 Python 包含了 C 扩展,则需要确保其能够在 Android 平台上运行。这通常意味着需要交叉编译适用于 ARM 架构的二进制文件。幸运的是,Chaquopy 已经预先处理了许多常见的科学计算(如 NumPy 和 Pandas)[^3]。 #### 3. **示例教程** 为了更好地理解如何在项目中引入第三方 Python ,可以参考 Chaquopy 官方提供的演示仓[^4]。其中展示了如何设置项目的构建脚本来包含额外的依赖项。下面是一个简单的例子展示如何添加外部至您的项目: ```gradle // build.gradle (Module: app) buildscript { repositories { mavenCentral() } } apply plugin: 'com.chaquo.python' chaquopy { pip { install "numpy" install "requests" } } ``` 上述 Gradle 配置片段表明,在构建过程中会自动拉取指定版本的 Numpy 和 Requests ,并将它们嵌入最终的应用包内。 #### 结论 综上所述,只要满足特定条件——即要么完全基于 Python 实现,或者已经适配好针对移动设备优化过的原生组件形式存在的话;那么绝大多数流行的开源软件集合都能顺利移植过来加以运用[^2].
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程之路从0到1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值