You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:15:26