Python虚拟环境打包异常:未安装的Numpy被PyInstaller纳入EXE
问题原因分析
你遇到的这个问题,核心在于你创建虚拟环境时没有完全隔离Anaconda的base环境。从你的CMD输出能看到,创建虚拟环境时显示了Using base prefix 'c:\\anaconda3'——这说明你用的virtualenv版本默认会继承base环境的site-packages路径,导致PyInstaller在打包时依然能从base环境中找到numpy,哪怕你的虚拟环境里没装这个包。
解决方法
按照下面的步骤操作,就能实现完全隔离的虚拟环境,打包时只包含你需要的依赖:
1. 创建完全隔离的虚拟环境
如果你坚持用virtualenv,需要加上--no-site-packages参数,确保虚拟环境不继承base环境的任何第三方包:
virtualenv test_env --no-site-packages
(注:较新版本的virtualenv默认已经是隔离模式,但你用的版本看起来是旧版,所以需要手动加这个参数)
或者改用Python自带的venv模块(Python 3.3+内置),它默认就是完全隔离的,不需要额外参数:
python -m venv test_env
2. 激活虚拟环境并安装必要依赖
激活虚拟环境后,先安装PyInstaller和你的脚本需要的numpy(因为你要打包的脚本依赖numpy):
# 激活虚拟环境 test_env\scripts\activate # 安装依赖 pip install pyinstaller numpy
3. 重新打包脚本
现在再用PyInstaller打包,就只会把虚拟环境里的numpy和PyInstaller相关依赖打包进去,体积会明显缩小:
pyinstaller test.py -y -F
验证效果
完成上面的步骤后:
- 激活虚拟环境直接运行
python test.py,会正常执行(因为你已经安装了numpy) - 如果删除虚拟环境里的numpy,运行脚本会提示
ModuleNotFoundError,此时打包出来的exe也会无法运行——这就说明虚拟环境完全隔离了,打包只会包含环境内的依赖。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

