Python 3.11 的冻结模块仅存在于定制编译的 CPython 中,标准发行版不支持;它通过将核心模块字节码编译进解释器二进制来跳过磁盘读取,需构建时启用,运行时无法开启。

Python 3.11 的冻结模块(frozen modules)不是用户可手动“启用”的功能,而是 CPython 构建时通过 PyConfig 或编译选项预置的机制;你在运行时无法用配置或环境变量“开启”它——它只存在于嵌入式或定制构建中,标准 CPython 发行版不包含冻结模块。
冻结模块只存在于定制构建中,pip 或 venv 里根本不存在
所谓“冻结模块”,是指把 __hello__.py、io.py、sysconfig.py 等核心模块的字节码直接编译进解释器二进制,跳过 import 时的磁盘读取和编译。这需要在编译 CPython 时设置 --with-frozen-modules(已废弃)或通过 Modules/Setup 手动添加,且 Python 3.11 默认关闭该路径。官方 macOS/Windows/Linux 安装包、pyenv、conda 构建均未启用。
- 你执行
python3.11 -c "import sys; print(hasattr(sys, '_frozen_modules'))"总是返回False -
importlib.util.find_spec('os')返回的是文件路径,不是None—— 这说明没被冻结 - 试图在运行时调用
sys.freeze()或设置sys.frozen = True会报AttributeError
冷启动加速的真实可行路径:用 py_compile 预编译 + -B 避免运行时写 .pyc
如果你的目标是减少首次 import 延迟(比如 CLI 工具、serverless 函数),冻结模块不是解法,但你可以控制字节码生成时机和位置:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 用
py_compile.compile()或compileall在部署时批量编译所有依赖,确保.pyc已存在 - 启动时加
-B参数(如python3.11 -B script.py),避免运行时尝试写入__pycache__(尤其在只读文件系统上失败) - 设置
PYTHONPYCACHEPREFIX指向可写的临时目录,让所有.pyc统一缓存,避免每个 virtualenv 重复生成 - 对极小脚本,考虑用
python3.11 -c "..."替代import,绕过模块查找开销
误读“冻结”概念的典型错误:混淆 frozen=True 和冻结模块
很多人看到 sys.frozen 为 True 就以为启用了冻结模块,其实这只是 PyInstaller / cx_Freeze 等打包工具设的标志位,表示“当前解释器被捆绑进一个可执行文件”,和 CPython 内置的 frozen modules 完全无关。
立即学习“Python免费学习笔记(深入)”;
-
sys.frozen是打包工具注入的 fake 属性,CPython 源码里不定义它 - 此时真正加速靠的是:单文件解压到内存 tmpdir + 预编译字节码 + 跳过
site-packages扫描 - 你用
pyinstaller --onefile app.py得到的加速,和 Python 3.11 的 frozen modules 无任何代码复用关系
真正想用冻结模块,得自己从源码构建 CPython,改 Modules/Setup,并接受后续无法 pip install 二进制扩展等限制。对绝大多数人,预编译 + 缓存路径优化才是实际可控的冷启动改进点。

















