Flet 打包更新
问题
当您将 Flet 程序打包成在移动设备(或桌面设备)上运行的 Python 程序时,生成的包(.apk、.ipa、.exe、.app)包含您的 Python 程序、Python 解释器和 Python 标准库。
如果您的程序只使用 Python 标准库,那么打包过程相对简单——Flet 会将您的代码压缩并将 Flutter 应用程序与为目标平台(Android 或 iOS)编译的 Python 解释器和标准库组合在一起。
然而,当您的 Flet 程序使用第三方包时,可能会出现问题,而这些包有数千个发布在 PyPI 或 Conda 上。
第三方包有两种类型:
纯 Python 包
“纯 Python”包是仅包含 Python 代码的包,不包括用 C、C++、Rust 或其他语言编写的扩展。您只需要一个 Python 解释器和 Python 标准库即可运行纯 Python 包,而无需关心您的操作系统或平台。
此类包的示例:httpx
、click
、rich
、requests
。
要验证包是否纯粹,请在 PyPI 上找到该包并导航到其“下载文件”页面。如 果在“已构建分发”部分下只有一个以 -py3-none-any.whl
结尾的 wheel,那么很可能它是一个纯 Python 包,可以在任何带有 Python 的设备上“按原样”运行。
![](/img/blog/packaging/pypi-pure-package.png)
我们说*“可能”*是因为该纯包可能依赖于非纯包,例如 pydantic
是一个纯包,但它需要使用 Rust 编写的 pydantic-core
非纯包才能正常工作。
非纯 Python 包
“非纯 Python”包是部分或全部用 C、C++、Rust 或其他语言编写并必须为其运行的平台编译为机器码的包。
此类包的示例:cryptography
、opencv-python
、numpy
、msgpack
。
在非纯包的“下载文件”页面上,您会发现为各种平台预构建的轮子:macOS、Windows、Linux。
![](/img/blog/packaging/pypi-non-pure-package.png)
当您运行 pip install <package>
时,pip 会尝试根据轮子后缀查找特定平台和 Python 版本的轮子。
这是包开发者提供的礼貌行为,为多个平台提供预编译的轮子。某些平台可能缺少轮子,或者没有轮子——只有“源分发”中的 .tar.gz
包含包源代码。