cx_Freeze依赖检测逻辑及打包体积过大(numpy_mkl)问题求助
cx_Freeze打包过大(含Anaconda MKL依赖)的解决方案及依赖检测说明
cx_Freeze依赖检测逻辑
cx_Freeze查找依赖的核心方式:
- 读取Python的
sys.path路径列表,遍历其中的模块文件; - 解析Python模块的
__file__属性定位依赖文件; - 通过分析动态链接库(.dll)的导入表,自动收集关联的系统库;
- 如果Anaconda的路径仍存在于
sys.path或系统环境变量(如PATH)中,会被误判为依赖路径,导致打包无关的MKL库。
解决方案
1. 确保虚拟环境彻底隔离
激活虚拟环境后,执行以下命令检查sys.path:
python -c "import sys; print('\n'.join(sys.path))"
如果输出中包含Anaconda相关路径(如C:\Users\anaconda3),说明虚拟环境未完全隔离:
- 重新创建虚拟环境时,添加
--no-site-packages参数(virtualenv默认已开启,可确认):virtualenv --no-site-packages .venv - 激活环境后,可在setup.py开头添加
sys.path过滤逻辑。
2. 临时清理Anaconda相关环境变量
激活虚拟环境后,在命令行中移除PATH里的Anaconda路径(以你的路径为例):
set PATH=%PATH:C:\Users\anaconda3\Library\bin;=% set PATH=%PATH:C:\Users\anaconda3;=%
再执行打包命令python setup.py build,避免cx_Freeze扫描到Anaconda的MKL库。
3. 在setup.py中强制排除Anaconda路径
修改setup.py,添加路径过滤和排除配置:
import sys from cx_Freeze import setup, Executable # 过滤sys.path中的Anaconda路径 sys.path = [path for path in sys.path if "anaconda3" not in path.lower()] # 定义可执行文件 main_executable = Executable("your_main_script.py") setup( name="YourAppName", version="1.0", executables=[main_executable], options={ "build_exe": { # 明确排除Anaconda的路径 "exclude_paths": ["C:\\Users\\anaconda3"], # 可额外排除不需要的模块 "excludes": ["numpy.testing", "numpy.distutils"], } } )
4. 安装无MKL依赖的Numpy
直接安装纯OpenBLAS版本的Numpy,彻底避免MKL库:
pip install numpy --no-binary :all:
5. 手动清理打包后的冗余文件
如果以上步骤仍有残留,打包完成后可直接删除build\exe.win-amd64-3.9\lib\numpy_mkl文件夹,再测试程序运行是否正常——若虚拟环境中的Numpy未依赖MKL,删除后程序仍能正常工作。
内容的提问来源于stack exchange,提问作者Woodrow
相关产品推荐
相关产品推荐

