
python 内置了若干冻结模块(frozen modules),主要用于加速启动和支撑导入系统,但它们不提供标准 python 接口查询;开发者应避免将自定义模块命名为标准库、内置函数或关键字,而非仅关注冻结模块名。
python 内置了若干冻结模块(frozen modules),主要用于加速启动和支撑导入系统,但它们不提供标准 python 接口查询;开发者应避免将自定义模块命名为标准库、内置函数或关键字,而非仅关注冻结模块名。
冻结模块(frozen modules)并非“无需 Python 即可运行”的可执行文件——这是一个常见误解。实际上,它们是被编译为字节码并静态嵌入 CPython 解释器二进制文件中的 Python 模块,在解释器初始化早期即被加载,无需磁盘 I/O 或文件系统查找。这类模块的存在意义在于:
- 保障核心导入机制(如
_frozen_importlib)在sys.path尚未就绪时即可工作; - 加速 Python 启动(自 3.11 起,大量标准库模块如
io、abc、enum等被冻结); - 提供导入系统自身功能的测试载体(如
_testimportmultiple)。
值得注意的是:Python 不提供任何官方、稳定、跨版本的 Python 层 API 来枚举冻结模块。sys.builtin_module_names 仅列出 内建模块(built-in modules,如 sys、builtins),不包含冻结模块;而冻结模块名称无法通过 dir()、help() 或 pkgutil.iter_modules() 获取。
若需技术性探查(仅限调试/学习,不建议用于生产逻辑),可通过 ctypes 访问 CPython 的底层符号。以下代码兼容 Python 3.10 及更早版本:
import ctypes
import itertools
class _frozen(ctypes.Structure):
_fields_ = [
('name', ctypes.c_char_p),
('code', ctypes.POINTER(ctypes.c_ubyte)),
('size', ctypes.c_int),
('is_package', ctypes.c_bool)
]
try:
frozen_ptr = ctypes.POINTER(_frozen).in_dll(ctypes.pythonapi, 'PyImport_FrozenModules')
if frozen_ptr:
for i in itertools.count():
record = frozen_ptr[i]
if not record.name:
break
print(record.name.decode('utf-8'))
except Exception as e:
print("Not available on this Python version:", e)
对于 Python 3.11+,由于冻结模块被拆分至三个未文档化的数组(_PyImport_FrozenBootstrap、_PyImport_FrozenStdlib、_PyImport_FrozenTest),需分别读取:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
# Python 3.11+ 兼容(非官方,可能随版本变更)
for array_name in ['_PyImport_FrozenBootstrap', '_PyImport_FrozenStdlib', '_PyImport_FrozenTest']:
try:
records = ctypes.POINTER(_frozen).in_dll(ctypes.pythonapi, array_name)
for i in itertools.count():
record = records[i]
if not record.name:
break
print(record.name.decode('utf-8'))
except (ValueError, OSError):
continue # 符号不存在则跳过
⚠️ 重要提醒:
- 上述 ctypes 方法依赖 CPython 内部实现细节,无 ABI 保证,不同版本甚至构建配置下可能失效;
- 冻结模块名称本身不是命名冲突的主要风险源——真正需规避的是:
✅ 所有sys.stdlib_module_names(可通过help('modules')或 Python 模块索引 查阅)
✅ 所有内置函数名(如len,print,open)
✅ 所有保留关键字(import keyword; keyword.kwlist) - 实际项目中,使用
pylint或flake8等工具可自动检测命名冲突,比手动维护黑名单更可靠。
综上,理解冻结模块有助于深入 Python 导入机制,但日常开发中,只需遵循标准命名规范,即可安全避开所有潜在冲突——无需为冻结模块名过度担忧。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










