尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Flet 0.86 起 `flet build` 默认将应用与依赖包编译为 `.pyc`:机制解读与迁移指南

发布时间:2026/9/24 17:05:30

资讯中心
01
ARTICLE

Flet 0.86 起 `flet build` 默认将应用与依赖包编译为 `.pyc`:机制解读与迁移指南

Flet 0.86 起 `flet build` 默认将应用与依赖包编译为 `.pyc`:机制解读与迁移指南
前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载自 Flet 0.86.0 起flet build会在打包时默认将应用自身与已安装的 Python 包预编译为字节码.pyc从而消除移动端每次冷启动时的重复编译开销。本文以官方变更说明为主体结合 flet-cli 源码与实际配置示例完整解读这一默认行为的来龙去脉、收益原理、关闭方式与参数优先级帮助你在升级后快速判断是否需要显式迁移。:::note 本文基于 Flet 0.86.0 编写后续版本可能新增 API 或提供额外的迁移路径。完整的破坏性变更索引见 breaking changes index。 :::变更总览编译默认开启在 0.86.0 之前flet build默认不编译 Python 源码除非你显式通过--compile-app/--compile-packages命令行参数或在pyproject.toml中配置[tool.flet.compile]主动开启。从 0.86.0 开始行为反转编译成为默认动作。flet build会通过python -m compileall -b将应用源码和已安装的包预编译为.pyc字节码并且原始.py文件会从最终打包产物中移除。这意味着最终交付的 bundle 中携带的是编译后的字节码而不是可直接阅读的 Python 源码。这一默认行为的转变在 flet-cli 的构建基类中有清晰的源码佐证。查看 build_base.pyif self.get_bool_setting(self.options.compile_app, compile.app, True): package_args.append(--compile-app) if self.get_bool_setting( self.options.compile_packages, compile.packages, True ): package_args.append(--compile-packages)get_bool_setting的第三个参数default_value传入了True即当命令行与pyproject.toml均未配置时编译默认开启随后把--compile-app/--compile-packages透传给打包工具链执行编译。为什么默认开启移动端冷启动的 zipimport 困境编译收益的核心在于预先编译好字节码省去每次启动时的重复编译。在桌面端Windows / macOS / Linux和 Web 端Python 通常从真实文件系统加载模块__pycache__可以把编译结果写回磁盘缓存因此「首次编译、之后复用」的模式代价较低。但移动端尤其是 Android的打包方式完全不同纯 Python 代码被打包进存储型stored非压缩zip运行时通过zipimport从 zip 中导入由于 zip 是只读存储、且字节码缓存无法写回 zip 内部__pycache__缓存机制完全失效结果是每次冷启动时每一个被导入的模块都必须从源码重新编译。在中等配置的 Android 设备上这一重复编译大约会带来12 秒的启动耗时且该开销随导入模块数量线性增长——应用依赖越多、启动越慢。这一背景在源码注释中亦有体现build_base.py 明确写道Android 采用 serious_python 的 native-mmap 打包方式纯 Python 代码以 stored zip 形式存在并通过zipimport读取。既然缓存无法落盘唯一的根治方案就是把「编译」从运行时前移到打包时——这正是本次默认值翻转的动机。同时编译开关本身并不是新功能它一直存在只是默认关闭。随着 Android 端转向 in-placezipimport打包继续默认关闭意味着每次启动都要付出重复的冷启动代价因此团队选择把默认值翻转为开启。编译机制compileall -b与 Web/Pyodide 兼容性验证编译动作实际执行的是标准库命令python -m compileall -b。其中-b--inplace的简写表示就地写入.pyc即把编译产物写到与源文件相同的位置而不是标准的__pycache__子目录这样在剥离.py源文件后字节码文件能保持原有的模块路径结构导入不受影响。关于 Web 构建有一个值得单独说明的兼容性验证点Flet 的 Web 构建依赖 Pyodide在浏览器中运行的 CPython。打包时用于编译的独立 CPython 与运行时的 Pyodide 需要共享相同的次要版本号例如都是 3.14并且 CPython 保证.pyc的 magic number 在某一次要版本的所有补丁版本间保持稳定——因此由宿主 CPython 预编译的字节码能被 Pyodide 运行时正确接受。换言之只要编译环境与 Pyodide 的 Python 次版本一致预编译字节码在浏览器中加载就没有兼容性问题。迁移指南大多数应用无需任何改动对绝大多数应用来说这次变更完全透明构建产物启动更快代码无需修改。升级到 0.86.0 后直接重新构建即可。以下情况属于需要关注的特例如果符合其中之一建议显式关闭编译依赖.py源码调试你希望在 bundle 中保留可读的 Python 源码例如用于线上排查、traceback 中查看源码行未编译时 traceback 能显示源码行编译后只剩字节码允许带语法错误构建源码存在语法错误时compileall会失败导致构建无法完成不编译则可以跳过此环节继续打包希望加速迭代构建编译环节本身耗时对于频繁的临时构建如本地联调跳过编译能缩短构建时间。通过 CLI 关闭编译0.86.0 中--compile-app与--compile-packages已改为argparse.BooleanOptionalAction类型因此每个参数都自动获得了--no-前缀形式原有的--compile-app/--compile-packages写法依旧有效。源码中可见参数定义build_base.pyparser.add_argument( --compile-app, destcompile_app, actionargparse.BooleanOptionalAction, defaultNone, helpPre-compile apps .py files to .pyc (on by default; use --no-compile-app to disable), )对应的关闭命令示例flet build apk --no-compile-app --no-compile-packages--no-compile-app只关闭应用自身源码的编译--no-compile-packages只关闭 site-packages 中已安装包的编译两者可独立使用按需组合。通过pyproject.toml关闭编译在项目根目录的pyproject.toml中配置[tool.flet.compile] app false packages false这样即使用户在命令行忘记加--no-参数项目配置也会统一强制关闭编译。除了全局配置Flet 还支持按平台覆盖例如只对 Android 构建关闭[tool.flet.android.compile] app false packages false平台名与构建目标对应apk/aab对应androidipa对应ios另有web、windows、macos、linux等完整平台映射见 build_base.py。参数解析优先级编译开关的最终取值遵循如下解析顺序优先级从高到低CLI 命令行参数--compile-app/--no-compile-app等[tool.flet.platform.compile]平台级配置如[tool.flet.android.compile][tool.flet.compile]全局配置默认值true即默认开启编译。这一优先级顺序在源码中由get_bool_setting精确实现build_base.py先检查 CLI 选项是否为None非空则直接采用否则依次回退到tool.flet.platform.setting、tool.flet.setting最后落到默认值。官方发布文档 Compilation and cleanup 中的「Resolution order」一节给出了同样的优先级说明可作为对照参考。配套机制与注意事项编译与 Cleanup 的关系与编译配套的还有清理cleanup机制二者常被一起讨论。flet build支持四类清理开关cleanup-app清理应用目录中的垃圾文件默认关闭cleanup-app-files指定额外 glob 删除应用目录文件指定后隐式启用cleanup-appcleanup-packages清理 site-packages 中的垃圾文件默认开启cleanup-package-files指定额外 glob 删除 site-packages 文件指定后隐式启用cleanup-packages。命令行组合示例来源publish/index.mdflet build target_platform \ --compile-app --compile-packages \ --cleanup-app-files **/*.c **/*.h --cleanup-package-files **/*.pyi对应的pyproject.toml写法[tool.flet.compile] # 或 [tool.flet.PLATFORM.compile] app true packages true [tool.flet.cleanup] # 或 [tool.flet.PLATFORM.cleanup] app true packages true app_files [**/*.c, **/*.h] package_files [**/*.pyi]需要注意的是cleanup系列与compile系列共用同一套「CLI → 平台级 → 全局 → 默认值」的优先级解析逻辑由同一个get_bool_setting支撑只是默认值不同cleanup-app默认为false/空列表cleanup-packages默认为true。macOS 签名陷阱关闭编译的副作用一个与关闭编译直接相关的实战提示来自 macOS 发布文档如果在 macOS 构建中关闭编译--no-compile-app/--no-compile-packages运行时 Python 会尝试在 bundle 内部创建__pycache__缓存目录这会在签名之后修改 bundle 内容进而触发MyApp is damaged and cant be opened之类的签名校验失败详见 macos.md。因此macOS 发布构建建议保持默认的编译开启状态。Python 版本切换会失效字节码另一个源码层面的防御性设计值得了解.pyc字节码与编译它的 Python 版本强绑定magic number 不匹配时运行时会报bad magic number。为此构建目录中会写入一个.python-version标记文件当检测到打包的 Python 版本发生变化时flet-cli 会自动清空构建目录强制全量重建避免把旧版本字节码混入新版本 bundle见 build_base.py。所以在使用--python-version或修改项目requires-python切换 Python 版本时无需手动清理build/目录。时间线与参考变更版本0.86.0关联文档编译与清理的完整 API 说明见 Compilation and cleanup构建命令参数参考见 flet-build CLI 文档版本发布说明见 release notes相关 PR#6598该变更对应的实现与讨论赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐Flet 应用分发打包指南从 flet build 看懂全平台构建机制Flet 应用分发打包指南从 flet build 看懂全平台构建机制 flet build 是 Flet CLI 提供的一键打包命令它能将 Python前端跨平台桌面应用移动开发Flet flet pack 命令完全指南将 Python 编写的 Flet 应用打包为独立桌面程序Flet flet pack 命令完全指南将 Python 编写的 Flet 应用打包为独立桌面程序 flet pack 是 Flet 官方 CLI fle前端跨平台桌面应用移动开发Flet flet publish 命令详解零 Flutter 依赖将 Python 应用发布为 Pyodide 静态网站Flet flet publish 命令详解零 Flutter 依赖将 Python 应用发布为 Pyodide 静态网站 flet publish 是 F前端跨平台桌面应用移动开发上一篇PhotoRec 开源数据恢复工具如何从硬盘、U 盘和 SD 卡中找回丢失文件下一篇铜钟音乐免费在线听歌双击歌曲即可播放创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。