笔者不推荐使用该软件打包,推荐使用 pyinstaller
介绍
cx_Freeze 是一套开源、跨平台的 Python 应用冻结(freeze)工具。核心目标:将 Python 源代码、Python 解释器、第三方扩展库、依赖资源捆绑,生成平台原生可执行文件,使目标机器无需预先安装 Python 环境即可运行程序。
名称中 freeze(冻结)含义:把动态解释执行的 Python 程序,绑定固定版本解释器与依赖,固化成可分发的二进制程序包。
项目起源:由 Anthony Tuininga 开发,持续维护多年;区别于早期 py2exe(仅Windows、停止维护),是长期活跃的跨平台冻结方案。
开源协议:PSF license(Python Software Foundation License),宽松商业友好,允许闭源商业软件使用,无传染性开源约束(和 PyInstaller 的 GPL 协议存在关键区别)。
官方文档:
https://cx-freeze.readthedocs.io/en/latest/index.html
底层工作原理
Python 本身是解释型语言,.py 文件不能直接被操作系统内核执行。cx_Freeze 的核心思路不是编译Python代码为机器码(重点区分:≠ Cython、Nuitka)。
完整运行机制分为三部分:
启动器(stub / executable stub)
cx_Freeze 会编译一个原生平台二进制启动器(Windows EXE、Linux ELF、macOS Mach-O)。
这个原生程序不包含 Python 逻辑,职责:- 初始化操作系统运行环境;
- 加载内置嵌入版 Python 解释器;
- 设置模块搜索路径;
- 载入编译后的 Python 字节码,启动入口脚本。
Windows下区分两种启动器:控制台启动器、Win32GUI无控制台GUI启动器。
嵌入Python解释器
打包时捆绑对应版本的 Python 共享库(Windowspython3xx.dll、Linuxlibpython.so、macOSPython.framework)。程序运行依靠这个附带的解释器执行代码。依赖收集与字节码打包
- 静态分析入口脚本,递归解析 import 导入语句,收集所有依赖模块;
- 将
.py源码编译为.pyc字节码(可选剔除原始py源码); - 把标准库、第三方 wheel 模块、C扩展模块(
.pyd/.so)一并收集; - 额外静态资源(图片、配置文件)作为外部文件一同存放。
关键结论:cx_Freeze 打包产物依旧运行Python字节码,不存在AOT编译为本机机器码。程序性能和原生Python运行几乎一致,不会提速。
产物形态设计
cx_Freeze 原生只支持「目录分发模式」,不存在内置单文件打包机制。
输出结构:一个独立文件夹,包含:
- 主启动可执行文件
- Python动态链接库
- 所有第三方模块、标准库(pyc、pyd等)
- 用户附加资源文件
为什么不提供原生单文件?
架构设计理念:优先追求运行稳定性。PyInstaller --onefile 的原理是运行时临时解压全部文件到系统临时目录;cx_Freeze 开发团队认为解压机制会带来启动变慢、杀毒软件误报、权限异常、临时文件残留等问题,因此不在内核实现该功能。
如果需要单文件,只能依靠第三方封装工具(Enigma Virtual Box、7-Zip自解压程序)外层二次封装。
功能与能力边界
支持能力
- 全平台支持:Windows、Linux、macOS;同时支持32位/64位构建。交叉编译不支持:只能在对应系统打包对应平台程序(Windows只能打包exe,不能直接产出Linux程序)。
- 兼容 CPython(主流官方Python),不支持 PyPy;支持 Python3.6 ~ Python3.13,持续跟随新版Python迭代。
- 完整支持纯Python模块,同时支持带二进制C扩展库的包(numpy、pandas、PyQt、OpenCV等)。
- 两种调用接口:
- 命令行接口 cxfreeze(轻量化,适合小型脚本)
- setuptools 集成接口(setup.py,标准化大型项目构建,可与pip生态打通)
- 精细的打包控制:手动包含模块、排除冗余模块、映射外部资源文件、自定义运行环境变量。
- 支持剥离源代码:仅打包pyc字节码,一定程度保护源码(注意:pyc可以被反编译,无法做到高强度加密)。
天然局限
- 依赖分析存在缺陷:动态导入代码无法自动识别
代码中使用__import__()、importlib动态导入模块时,静态扫描无法捕获依赖,打包后运行出现 ModuleNotFoundError,必须手动显式声明需要包含的包。 - 打包体积偏大:默认会收集大量标准库组件,如果不主动exclude排除无用模块,输出文件夹臃肿。
- 不支持内嵌数据压缩,所有模块以松散文件形式存放。
- 无法脱离系统底层依赖:Windows程序依然依赖VC++运行库;Linux依赖系统glibc版本,打包产物不具备完全静态链接特性。
- 对特殊包兼容性偶尔较差:部分使用非常规加载机制的框架(部分异步框架、嵌入式GUI)需要额外配置。
架构设计特点(对比同类冻结工具)
1. cx_Freeze vs PyInstaller
- 协议:cx_Freeze(PSF,宽松商用);PyInstaller(GPL,分发程序存在开源合规风险)
- 产物:cx_Freeze 默认目录包,无内置单文件;PyInstaller 原生支持文件夹 / 单文件两种模式
- 实现:两者都是「启动器+嵌入解释器+字节码」模式,都不编译成本机代码
- 生态:PyInstaller社区更大,遇到问题解决方案更多;cx_Freeze 更新节奏平稳,bug数量更少,误报相对低
- 运行机制:cx_Freeze直接读取目录内文件;单文件模式的PyInstaller运行需要解压
2. cx_Freeze vs Nuitka
根本性区别:
- cx_Freeze:冻结工具,打包解释器+字节码;运行性能不变
- Nuitka:Python转C代码编译器,将Python翻译为C再编译二进制;属于编译方案,性能提升明显
3. cx_Freeze vs py2exe
py2exe仅支持老旧Windows与低版本Python,项目停止维护;cx_Freeze是现代化继任方案。
适用场景 & 不推荐场景
适合使用 cx_Freeze
- 需要开发闭源商业软件,在意开源许可证,规避GPL约束;
- 追求程序长期稳定运行,厌恶单文件解压带来的各种疑难bug;
- 软件以文件夹形式分发(绿色软件,解压即用),不强制要求单一exe;
- 跨平台项目,需要一套构建逻辑同时打包 Windows/Linux/macOS;
- 使用标准setuptools管理项目,希望构建流程融入python原生打包体系。
不推荐使用 cx_Freeze
- 硬性要求原生一键生成独立单exe文件,不愿意额外使用第三方封装工具;
- 大量使用动态import,模块繁多,不想手动维护依赖列表;
- 新手,遇到问题希望网上能找到海量现成解决方案(优先选择PyInstaller)。
分发相关客观说明
- 打包产物没有加密保护:提取目录后,可以直接拿到pyc字节码,借助反编译工具还原源代码,不能用于核心机密代码保护;
- Windows平台打包出来的exe依然容易被杀毒软件标记,程度略好于单文件模式的PyInstaller,但无法完全避免;
- 架构层面不提供防篡改、加壳能力,加壳需要外部工具独立完成;
- 版本绑定:打包时捆绑的Python解释器版本固定。不能将打包程序迁移到其他Python版本环境,互不通用。
安装
pip install cx_Freeze
打包
cxfreeze hello.py --target-dir dist