查看: 167|回复: 3

PipConda混用CRT冲突 WinError1114修复

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Anaconda(Miniconda)环境中混用pip和conda安装带有C扩展的Python包时,可能遇到一个典型的Windows动态链接库(DLL)初始化失败错误:OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败,具体错误信息指向c10.dll或其依赖项。该问题常见于通过pip安装新版PyTorch(版本≥2.4)或其他依赖新版MSVC编译的C扩展包后,执行import torch时立即抛出异常。有时也会表现为“A module that was compiled using NumPy 1.x cannot be run in NumPy 2.2.6”这样的ImportError。任何通过Python C API嵌入Python的宿主程序同样会因进程内加载了不兼容的DLL而崩溃。

根因分析
问题的根源在于conda与pip的职责边界不同。conda管理整个运行时栈(包括VC++ CRT运行时库),而pip只管理Python包之间的依赖,并不关心CRT版本。当用户使用pip install cellpose时,pip会自动升级numpy从1.26到2.2.6,导致旧版torch 2.3.1无法继续使用;随后pip又将torch升级到2.13.0(最新版)。torch 2.13.0使用Visual Studio 2022 17.12(linker版本14.42)编译,需要VCRUNTIME140.dll的版本≥14.42。但是Anaconda根目录(如D:\Anaconda3\)下的VCRUNTIME140.dll版本为14.29(对应VS 2019)。根据Windows DLL搜索顺序,应用程序目录(即Python可执行文件同级目录)优先级最高,因此Python会加载Anaconda自带的旧版CRT,导致torch 2.13.0的c10.dll中的DllMain初始化失败,触发WinError 1114。

诊断过程中,通过预加载所有依赖DLL(VCRUNTIME140、MSVCP140等)后仍失败,排除了依赖缺失的可能性;使用LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES)确认c10.dll文件本身未损坏;使用pefile分析发现成功加载的DLL使用了linker 8.0(VS 2005),而失败的DLL使用linker 14.42,表明编译工具链差异是直接原因。conda list显示vs2015_runtime版本为14.29,而缓存中已有更高版本的vc14_runtime(14.44/14.51),但并未自动升级。

修复方案
推荐的正规方案是升级conda的CRT包:
  1. conda install vc14_runtime -y
复制代码
执行后,vs2015_runtime从14.29升级到14.44,同时安装vc14_runtime 14.44。VCRUNTIME140.dll更新至兼容版本,torch 2.13.0即可正常运行。原理是PyTorch的conda包声明了vc14_runtime >= 14.44,conda求解器自动识别并升级。CRT 14.x系列向后兼容,新版可运行旧代码。

如果无法使用正规方案,可采取应急方案手动替换DLL:
  1. ren D:\Anaconda3\vcruntime140.dll vcruntime140.dll.old
  2. ren D:\Anaconda3\vcruntime140_1.dll vcruntime140_1.dll.old
  3. copy C:\Windows\System32\vcruntime140.dll D:\Anaconda3\
  4. copy C:\Windows\System32\vcruntime140_1.dll D:\Anaconda3\
复制代码
注意:此方案会破坏conda的包追踪,后续conda update可能覆盖为新版或失败。

常见的无效方案包括:安装最新VC++ Redistributable(系统已有14.51,但Anaconda目录旧DLL优先级更高);pip install --force-reinstall torch(重复安装不改变CRT);os.add_dll_directory设置搜索路径(不影响已加载的系统DLL);预加载CRT DLL(VCRUNTIME140只能加载一次,已被旧版占用)。

最佳实践
在conda环境中,推荐优先使用conda安装带有C扩展的包,避免混用pip。如果必须使用pip,应先用conda打好运行时基础:
  1. conda install vc14_runtime -y
  2. pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
  3. python -c "import torch; print(torch.__version__)"
复制代码
长期策略包括:每个项目使用独立的conda环境以隔离CRT版本,避免连锁污染;导出环境时使用conda env export(pip freeze无法记录非Python依赖);优先使用conda-forge渠道,其更新更频繁,CRT依赖更明确;定期执行conda update --all以保持vc14_runtime等系统包与最新工具链同步。

从架构层面理解,pip与conda的职责边界不同。pip只管理Python包之间的依赖,而conda管理整个运行时栈(包括CRT)。当pip安装的包隐式依赖新版CRT时,conda无法感知,导致版本不匹配。根本解决方案是统一包管理器——在conda环境中优先使用conda。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: PipConda混用CRT冲突 WinError1114修复

感谢楼主分享这么详细的诊断和修复方案!我正好在Anaconda里用pip装了新版torch后遇到了同样的WinError 1114,按你推荐的 `conda install vc14_runtime -y` 一步就解决了,之前折腾了好久手动替换DLL都没搞定。这个根因分析很到位,确实之前没意识到conda和pip对CRT管理上的差异,受教了。 想请教一下,如果我已经用应急方案手动替换了DLL,现在想恢复conda的包追踪,该怎么做?是重新执行 `conda install vc14_runtime` 覆盖回去,还是需要先还原备份再升级?
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: PipConda混用CRT冲突 WinError1114修复

楼主分析得非常透彻,我也是在conda环境里混用pip装新版PyTorch时遇到这个1114错误,排查了很久才找到根源。感谢分享的修复方案,`conda install vc14_runtime -y`这条确实比手动替换DLL更干净。之前一直以为装了系统VC++ Redistributable就够用了,没想到Anaconda自带的老版本会优先加载。最佳实践中强调的“独立环境隔离CRT”也很实用,我准备把项目环境都重建一遍,避免将来再踩坑。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: PipConda混用CRT冲突 WinError1114修复

感谢楼主分享这么详细的排查过程和修复方案!之前也遇到过 WinError 1114,试了重装 PyTorch、更新 VC++ 运行库都没解决,原来根结在于 Anaconda 自带的旧版 CRT 被优先加载了。楼主提到的 `conda install vc14_runtime -y` 先升级后再用 pip 安装,这个思路很关键,以后混合安装 C 扩展包时先锁定运行时环境,能省去很多排查时间。 另外想请教一下,您建议“每个项目使用独立 conda 环境”来隔离 CRT 版本,但实际中如果系统 PATH 或 Anaconda 根目录下已经有了旧版 DLL,即使在新环境里 pip 安装新包,会不会仍然优先加载根目录下的文件呢?还是说 conda 环境的 `library/bin` 搜索顺序能覆盖掉根目录?期待您再补充一些环境隔离时的注意事项。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-12 12:07 , Processed in 0.028877 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部