引言
python 是一门功能强大、生态丰富的语言,广泛用于数据处理、机器学习和后端服务。然而,python 并不是原生的移动端开发语言(android 主要使用 java/kotlin,ios 主要使用 swift/objective-c)。如果希望在移动端 app(android 或 ios)中调用 python 代码,最好的方式是 将 python 代码打包成 sdk,然后通过 ffi(外部函数接口)或本地服务 让 app 访问它。
本文将介绍几种 python 代码打包成可调用 sdk 的方法,包括 pyinstaller、cython、pyoxidizer、kivy + buildozer、chaquopy、beeware 等,并提供详细的步骤。
1. 选择打包方式
不同的打包方式适用于不同的应用场景:
方法 | 适用场景 | 适用平台 | 主要优点 | 主要缺点 |
---|---|---|---|---|
pyinstaller | 桌面应用 | windows, macos, linux | 快速生成可执行文件 | 生成的文件较大,不适合移动端 |
cython | 计算密集型模块 | windows, macos, linux, android, ios | 可加速 python 代码 | 需要额外的 c 语言开发 |
pyoxidizer | 跨平台应用 | windows, macos, linux | 生成独立可执行文件 | 配置较复杂 |
kivy + buildozer | 移动 app | android, ios | 直接开发移动 app | ui 组件较少 |
chaquopy | 在 android 运行 python 代码 | android | 适配原生 ui | 仅支持 android |
beeware | 在 ios 运行 python 代码 | ios, android | 适配原生 ui | 生态不成熟 |
如果你的目标是 将 python 代码打包成 sdk,供 android/ios app 调用,推荐以下方法:
- cython + jni(android)
- python 后端 + http api(通用方案)
- chaquopy(仅 android)
- beeware(仅 ios)
2. 方法一:使用 cython 生成动态链接库(适用于 android/ios)
2.1. 原理
cython 可以将 python 代码编译成 c 代码,并生成动态链接库(.so 或 .dll),然后可以在 android 或 ios 通过 jni(java native interface)或 ffi(foreign function interface)调用。
2.2. 步骤
(1)安装 cython
pip install cython
(2)编写 python 代码
假设我们有一个简单的 python 计算模块 math_utils.py
:
def add(a: int, b: int) -> int: return a + b
(3)创建 math_utils.pyx
将代码改成 cython 代码(.pyx
文件):
# math_utils.pyx def add(int a, int b): return a + b
(4)编写 setup.py
from setuptools import setup from cython.build import cythonize setup( ext_modules=cythonize("math_utils.pyx", language_level="3"), )
(5)编译成 .so
(linux/android) 或 .dylib
(macos/ios)
python setup.py build_ext --inplace
这会生成 math_utils.cpython-38-x86_64-linux-gnu.so
(linux) 或 .dylib
(macos)。
(6)在 java/kotlin 调用(android)
在 android 项目中加载 .so
文件:
system.loadlibrary("math_utils"); public class mathutils { public native int add(int a, int b); }
3. 方法二:使用 http api(适用于 android/ios)
3.1. 原理
- 将 python 代码部署到服务器
- 让移动端 app 通过 http api 访问 python 服务
3.2. 步骤
(1)安装 fastapi
pip install fastapi uvicorn
(2)编写 fastapi 代码
from fastapi import fastapi app = fastapi() @app.get("/add") def add(a: int, b: int): return {"result": a + b} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
(3)运行 api 服务器
uvicorn main:app --host 0.0.0.0 --port 8000
(4)在移动端 app 调用
在 android/ios 代码中请求 api:
url url = new url("http://server_ip:8000/add?a=3&b=4"); httpurlconnection conn = (httpurlconnection) url.openconnection(); conn.setrequestmethod("get");
4. 方法三:使用 chaquopy(适用于 android)
4.1. 原理
chaquopy 允许在 android 项目中直接运行 python 代码,并与 java 交互。
4.2. 步骤
(1)在 android 项目 build.gradle
中添加依赖
dependencies { implementation 'com.chaquo.python:gradle:12.0' }
(2)在 pythonactivity.java
运行 python 代码
import com.chaquo.python.python; import com.chaquo.python.android.androidplatform; if (!python.isstarted()) { python.start(new androidplatform(this)); } python py = python.getinstance(); pyobject obj = py.getmodule("script").callattr("add", 3, 5); system.out.println(obj.tostring());
5. 方法四:使用 beeware(适用于 ios)
5.1. 原理
beeware 允许在 ios 上运行 python 代码,使用 rubicon-objc
进行 ios 交互。
5.2. 步骤
安装 beeware:
pip install briefcase
创建 ios 项目:
briefcase create ios
运行 ios 模拟器:
briefcase run ios
6. 总结
方案 | 适用平台 | 主要优点 | 主要缺点 |
---|---|---|---|
cython + jni | android, ios | 高性能,可本地调用 | 需编译 .so /.dylib ,较复杂 |
http api | 通用 | 易于扩展 | 需要网络连接 |
chaquopy | android | 直接在 android 运行 python | 仅支持 android |
beeware | ios | 直接在 ios 运行 python | 生态不成熟 |
如果希望 python 高效运行在 app 内部,建议使用 cython + jni;如果希望 快速集成,建议 用 fastapi 作为后端。不同应用场景可以选择不同方案,希望本文能帮助你成功将 python 代码打包成 sdk!
以上就是将python代码打包成可调用sdk的几种方法小结(适用于移动端 app)的详细内容,更多关于python代码打包成sdk的资料请关注代码网其它相关文章!
发表评论