將Python代碼打包成可調(diào)用SDK的四種方法小結(jié)(適用于移動(dòng)端 App)
引言
Python 是一門(mén)功能強(qiáng)大、生態(tài)豐富的語(yǔ)言,廣泛用于數(shù)據(jù)處理、機(jī)器學(xué)習(xí)和后端服務(wù)。然而,Python 并不是原生的移動(dòng)端開(kāi)發(fā)語(yǔ)言(Android 主要使用 Java/Kotlin,iOS 主要使用 Swift/Objective-C)。如果希望在移動(dòng)端 App(Android 或 iOS)中調(diào)用 Python 代碼,最好的方式是 將 Python 代碼打包成 SDK,然后通過(guò) FFI(外部函數(shù)接口)或本地服務(wù) 讓 App 訪問(wèn)它。
本文將介紹幾種 Python 代碼打包成可調(diào)用 SDK 的方法,包括 PyInstaller、Cython、PyOxidizer、Kivy + Buildozer、Chaquopy、BeeWare 等,并提供詳細(xì)的步驟。
1. 選擇打包方式
不同的打包方式適用于不同的應(yīng)用場(chǎng)景:
方法 | 適用場(chǎng)景 | 適用平臺(tái) | 主要優(yōu)點(diǎn) | 主要缺點(diǎn) |
---|---|---|---|---|
PyInstaller | 桌面應(yīng)用 | Windows, macOS, Linux | 快速生成可執(zhí)行文件 | 生成的文件較大,不適合移動(dòng)端 |
Cython | 計(jì)算密集型模塊 | Windows, macOS, Linux, Android, iOS | 可加速 Python 代碼 | 需要額外的 C 語(yǔ)言開(kāi)發(fā) |
PyOxidizer | 跨平臺(tái)應(yīng)用 | Windows, macOS, Linux | 生成獨(dú)立可執(zhí)行文件 | 配置較復(fù)雜 |
Kivy + Buildozer | 移動(dòng) App | Android, iOS | 直接開(kāi)發(fā)移動(dòng) App | UI 組件較少 |
Chaquopy | 在 Android 運(yùn)行 Python 代碼 | Android | 適配原生 UI | 僅支持 Android |
BeeWare | 在 iOS 運(yùn)行 Python 代碼 | iOS, Android | 適配原生 UI | 生態(tài)不成熟 |
如果你的目標(biāo)是 將 Python 代碼打包成 SDK,供 Android/iOS App 調(diào)用,推薦以下方法:
- Cython + JNI(Android)
- Python 后端 + HTTP API(通用方案)
- Chaquopy(僅 Android)
- BeeWare(僅 iOS)
2. 方法一:使用 Cython 生成動(dòng)態(tài)鏈接庫(kù)(適用于 Android/iOS)
2.1. 原理
Cython 可以將 Python 代碼編譯成 C 代碼,并生成動(dòng)態(tài)鏈接庫(kù)(.so 或 .dll),然后可以在 Android 或 iOS 通過(guò) JNI(Java Native Interface)或 FFI(Foreign Function Interface)調(diào)用。
2.2. 步驟
(1)安裝 Cython
pip install cython
(2)編寫(xiě) Python 代碼
假設(shè)我們有一個(gè)簡(jiǎn)單的 Python 計(jì)算模塊 math_utils.py
:
def add(a: int, b: int) -> int: return a + b
(3)創(chuàng)建 math_utils.pyx
將代碼改成 Cython 代碼(.pyx
文件):
# math_utils.pyx def add(int a, int b): return a + b
(4)編寫(xiě) 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
這會(huì)生成 math_utils.cpython-38-x86_64-linux-gnu.so
(Linux) 或 .dylib
(macOS)。
(6)在 Java/Kotlin 調(diào)用(Android)
在 Android 項(xiàng)目中加載 .so
文件:
System.loadLibrary("math_utils"); public class MathUtils { public native int add(int a, int b); }
3. 方法二:使用 HTTP API(適用于 Android/iOS)
3.1. 原理
- 將 Python 代碼部署到服務(wù)器
- 讓移動(dòng)端 App 通過(guò) HTTP API 訪問(wèn) Python 服務(wù)
3.2. 步驟
(1)安裝 FastAPI
pip install fastapi uvicorn
(2)編寫(xiě) 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)運(yùn)行 API 服務(wù)器
uvicorn main:app --host 0.0.0.0 --port 8000
(4)在移動(dòng)端 App 調(diào)用
在 Android/iOS 代碼中請(qǐng)求 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 項(xiàng)目中直接運(yùn)行 Python 代碼,并與 Java 交互。
4.2. 步驟
(1)在 Android 項(xiàng)目 build.gradle
中添加依賴
dependencies { implementation 'com.chaquo.python:gradle:12.0' }
(2)在 PythonActivity.java
運(yùn)行 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 上運(yùn)行 Python 代碼,使用 Rubicon-ObjC
進(jìn)行 iOS 交互。
5.2. 步驟
安裝 BeeWare:
pip install briefcase
創(chuàng)建 iOS 項(xiàng)目:
briefcase create iOS
運(yùn)行 iOS 模擬器:
briefcase run iOS
6. 總結(jié)
方案 | 適用平臺(tái) | 主要優(yōu)點(diǎn) | 主要缺點(diǎn) |
---|---|---|---|
Cython + JNI | Android, iOS | 高性能,可本地調(diào)用 | 需編譯 .so /.dylib ,較復(fù)雜 |
HTTP API | 通用 | 易于擴(kuò)展 | 需要網(wǎng)絡(luò)連接 |
Chaquopy | Android | 直接在 Android 運(yùn)行 Python | 僅支持 Android |
BeeWare | iOS | 直接在 iOS 運(yùn)行 Python | 生態(tài)不成熟 |
如果希望 Python 高效運(yùn)行在 App 內(nèi)部,建議使用 Cython + JNI;如果希望 快速集成,建議 用 FastAPI 作為后端。不同應(yīng)用場(chǎng)景可以選擇不同方案,希望本文能幫助你成功將 Python 代碼打包成 SDK!
以上就是將Python代碼打包成可調(diào)用SDK的幾種方法小結(jié)(適用于移動(dòng)端 App)的詳細(xì)內(nèi)容,更多關(guān)于Python代碼打包成SDK的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python入門(mén)while循環(huán)語(yǔ)句理解學(xué)習(xí)
這篇文章主要介紹了python入門(mén)while循環(huán)語(yǔ)句理解學(xué)習(xí),文中附含詳細(xì)圖文示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09詳解使用Selenium爬取豆瓣電影前100的愛(ài)情片相關(guān)信息
這篇文章主要介紹了詳解使用Selenium爬取豆瓣電影前100的愛(ài)情片相關(guān)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03python 實(shí)現(xiàn)將多條曲線畫(huà)在一幅圖上的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)將多條曲線畫(huà)在一幅圖上的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Python爬蟲(chóng)突破反爬蟲(chóng)機(jī)制知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于Python爬蟲(chóng)突破反爬蟲(chóng)機(jī)制知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-11-11pydev debugger: process 10341 is co
這篇文章主要介紹了pydev debugger: process 10341 is connecting無(wú)法debu的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Python WEB應(yīng)用部署的實(shí)現(xiàn)方法
這篇文章主要介紹了Python WEB應(yīng)用部署的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python利用zhconv模塊進(jìn)行簡(jiǎn)繁體字轉(zhuǎn)換的案例演示
zhconv是一個(gè)Python庫(kù),提供了簡(jiǎn)體字和繁體字之間的轉(zhuǎn)換功能,本教程將向你展示如何使用zhconv模塊來(lái)實(shí)現(xiàn)簡(jiǎn)繁體字的互轉(zhuǎn),并附帶一個(gè)案例演示,感興趣的朋友可以參考一下2024-05-05