Skip to content

应用与包默认编译为 .pyc ​

INFO

本指南以 Flet 0.86.0 为准,内容是最准确的。后续版本可能会新增 API 或增加额外的迁移路径。

破坏性变更与废弃索引列出了为每个版本编写的指南。

概述 ​

flet build 现在默认将你的应用和已安装的包编译为 .pyc(通过 python -m compileall -b,并从包中移除原始的 .py 文件)。以前除非你通过 --compile-app / --compile-packages 或 pyproject.toml 中的 [tool.flet.compile] 显式开启,否则编译是关闭的。

分发字节码省去了每次启动时的重新编译。这个收益在移动端最大——因为纯 Python 是从一个存储型、就地 zip(zipimport)导入的,无法把字节码缓存回磁盘——所以如果没有预编译的 .pyc,每个模块都会在每个冷启动时从源码重新编译。在中端 Android 设备上,这大约会消耗 1–2 秒的启动时间,并随导入模块数量而增加。

背景 ​

编译一直都可以通过 --compile-app / --compile-packages 标志开启;只是默认关闭。随着 Android 上转为就地 zipimport 打包方式,保持关闭意味着每次启动都要反复付出冷启动代价,因此默认值被翻转为开启。

已验证编译后的 Web 构建能在 Pyodide 中正确加载:用于编译的独立 CPython 与 Pyodide 运行时共享相同的次版本(例如 3.14),而 CPython 会在一个次版本的各补丁发布之间保持 .pyc 的魔数稳定,因此字节码会被接受。

迁移指南 ​

大多数应用无需改动——构建只是启动得更快。

如果你依赖未编译的构建(为了在包里保留 .py 源码以便调试、为了让构建在存在语法错误时也能完成,或为了加速迭代构建),请显式退出。

通过 CLI 标志退出 ​

这些标志现在都是 argparse.BooleanOptionalAction,因此每个都有 --no- 形式(原有的 --compile-app / --compile-packages 仍然可用):

bash
flet build apk --no-compile-app --no-compile-packages

在 pyproject.toml 中退出 ​

toml
[tool.flet.compile]
app = false
packages = false

按平台的覆盖也有效,例如 [tool.flet.android.compile]。解析优先级为 CLI 标志 → [tool.flet.<platform>.compile] → [tool.flet.compile] → 默认值(true)。

时间线 ​

  • 变更于:0.86.0

参考 ​


关注我,学习大模型、大数据、Python等热门技术。