不少人在Windows上玩Python时,都会在一个“看似与Python无关”的地方翻车:pip install装到一半,屏幕突然冒出一大段红色报错,开头第一行赫然写着“Microsoft Visual C++ 14.0 or greater is required”,下面还带一句“Get it with Microsoft C++ Build Tools”。我第一次碰到这串英文时,第一反应是“我装的Python是不是被什么奇怪的东西劫持了”,折腾了半天才发现,这其实是pip在替你喊话:你缺的不是Python,缺的是一整套C/C++编译工具链。
这篇文章就专门拆解这个报错:它是什么情况下被触发的、为什么要求“14.0”、安装Microsoft C++ Build Tools的正确步骤是什么,以及如果你想绕开编译器,还有哪些更省事的替代方案。不管是刚入门的小白,还是被项目依赖逼着解决编译问题的老开发,照着这篇的思路走一遍都能解决。
1. 报错触发的真实场景:pip从“下载轮子”切换到“现场编译”了
1.1 报错到底长什么样
先看一眼完整报错,方便你确认自己遇到的就是这个情况:
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/有些包还会在报错前面带一段长长的编译日志,比如building 'mysqlclient' extension、error: command 'cl.exe' failed之类。但不管前面那段日志多花哨,核心结论都是同一件事:当前机器上没有可用的MSVC编译器,而你要装的这个Python包,必须现场编译C/C++代码。
1.2 什么包最容易触发这个报错
不是所有pip安装都会走到“现场编译”这条路。绝大多数热门库在PyPI上都有预编译好的wheel包(二进制轮子),下载下来解压就能用,根本不需要编译器。真正触发报错的,是那些没有对应wheel、或者因为某些原因被迫走“源码分发(sdist)”流程的包。
最常见的触发场景有这么几类:
| 包名 | 常见触发原因 | 典型使用场景 |
|---|---|---|
| mysqlclient | 只提供sdist为主,Windows下经常要编译 | 爬虫、Web后端连MySQL |
| lxml | Python版本过新或特定平台时没有现成wheel | HTML/XML解析 |
| pandas / numpy | 老版本或特殊编译参数下会从源码构建 | 数据分析 |
| dlib | 老版本没有匹配新Python的wheel | 人脸关键点检测 |
| pycryptodome | 部分版本/平台需要本地编译 | 加解密 |
| pymssql | 依赖FreeTDS,Windows轮子不全 | SQL Server访问 |
| prophet | C++编译量大,版本适配空窗期常见 | 时序预测 |
实际上,日常开发中你把Python升到最新版(比如刚发布3.13头几个月),或者用一个不太主流的32位Python,遇到这种报错的概率会明显上升。因为新版本刚出来时,很多库还没把编译好的wheel上传到PyPI,pip只能退而求其次去拿源码包,然后在你本机完成编译。
1.3 为什么“平时很少见,碰到了就很懵”
这个报错之所以让很多人困惑,是因为它的出现逻辑藏得比较深。pip安装一个包时,内部优先级大致是:
- 优先下载并安装
.whl格式的wheel包; - 如果找不到匹配当前平台、Python版本的wheel,就下载
.tar.gz源码包; - 源码包中如果有C扩展,就会调用本机编译器构建;
- 找不到编译器,直接抛报错。
也就是说,只要PyPI上有适合你当前Python版本的wheel,pip根本不会去碰源码,你也永远不会看到这个报错。而当你在一个全新的环境里复现项目、或者突然装了一个偏门依赖,它就冒出来了。
这里还要提醒一句:报错出现后,不要立刻重装Python,也不要满世界搜“修复补丁”。你的Python解释器本身完全正常,缺的只是一个依附于操作系统的编译工具链而已。
2. 为什么偏偏是14.0:Python与MSVC编译器的版本绑定逻辑
2.1 版本号背后的恩怨
“Microsoft Visual C++ 14.0”这个数字,不像看起来那么随意。它指的是微软从Visual Studio 2015开始启用的C++工具集主版本号。更准确地说,VS 2015对应MSVC 14.0,VS 2017对应MSVC 14.1x,VS 2019对应MSVC 14.2x,VS 2022对应MSVC 14.3x。从VS2015开始,微软把MSVC的主版本号统一锁定为14,后面只是小版本迭代。
那为什么Python会认这个版本号?因为Windows上的官方CPython解释器,本身就是用MSVC编译出来的。Python安装包里的python311.dll、python.exe,二进制层面都依赖MSVC生成的一套规范。任何以C扩展形式存在的第三方库(最终会生成.pyd文件),都必须和解释器使用“同一套编译体系”的产物,才能安全地对接C API和内存布局。
setuptools在构建扩展时,会在系统中定位可用的Visual Studio Build Tools。它默认要求最低主版本是14.0。如果你机器上装的工具链是VS2013(即MSVC 12.0)或者更老的版本,同样会报这个错,因为那条路早就走不通了。
2.2 一句话理解ABI兼容
把这个逻辑翻译成生活场景:Python解释器像一家工厂,C扩展像一批要送进工厂的定制零件。零件必须用“厂里指定的同款规格机床”加工,否则就算强行装上,运行起来也可能出现内存错乱、崩溃或各种离奇行为。这台“指定规格机床”就是MSVC 14.0或更新版本的编译工具链。
这里有个细节值得多说一句:为什么不能用MinGW(GCC的Windows移植版)替代?理论上有些包确实可以用MinGW编译,但Python官方和大多数C扩展维护者都不推荐。混用编译器和运行库,可能导致malloc/free跨越不同CRT边界、异常处理机制不一致等问题,平时看着没事,一运行到特定路径就崩,排查起来极其痛苦。所以在Windows上用pip装带C扩展的Python包,老老实实装MSVC才是正路。
2.3 “or greater”是怎么个“greater”法
报错信息里那句“or greater”,指的是你装VS2022自带的MSVC v143工具集完全没问题,VS2019的v142、VS2017的v141也都可以。只要是14.0及以上,都能被Python的构建系统识别和使用。因为从VS2015开始,MSVC保持了很强的二进制兼容性,后续版本生成的扩展基本都能和CPython配合良好。
所以你在网上可以看到各种讨论,有人说“安装了Visual Studio 2022之后此报错就消失了”,也有人用老旧的VS2015解决了问题。这不矛盾,它们都在14.0门槛之上,只是时代不同。
3. 官方修复路线:安装Microsoft C++ Build Tools的全流程
3.1 先找到正确的下载入口
解决这个报错最彻底的方式,就是按报错提示里的链接,去微软官网下载Microsoft C++ Build Tools。这里要特别强调:这个工具和你在Visual Studio Installer里装“使用C++的桌面开发”工作负载,本质上是同一套东西,只是Build Tools更精简、更面向命令行和CI场景。下载地址有两个,任选其一:
- 官方页面:https://visualstudio.microsoft.com/visual-cpp-build-tools/
- 直接下载安装器:https://aka.ms/vs/17/release/vs_BuildTools.exe
如果你需要的是特定年份的旧版工具链(比如某些老项目要求v140),也可以去Visual Studio官网的“下载旧版本”区域找对应的Build Tools下载链接,但绝大多数情况下,直接装最新的VS2022 Build Tools就够用了。
3.2 图形界面安装步骤
双击下载好的vs_BuildTools.exe,会出现一个安装引导界面。跟着下面的步骤走:
- 接受微软许可协议(第一次启动会让你设置一些隐私选项,按需勾掉即可);
- 在“工作负载”标签页里,勾选**“使用C++的桌面开发”**(英文界面是“Desktop development with C++”);
- 右侧会列出这一工作负载的必要组件。如果你只想最小化安装,可以取消勾选一些重量级组件,但至少要保留:
- MSVC v143 – VS 2022 C++ x64/x86 生成工具;
- Windows 11 SDK,或者Windows 10 SDK(版本取决于你的系统);
- MSBuild(构建项目所需,通常默认会带上);
- 点击右下角的“安装”按钮,等待进度条走完。
安装时间取决于网络速度,一般20分钟到1小时不等。Progress bar走到最后可能会卡住几分钟,那是它在做最后的校验和配置,耐心等就行。
3.3 命令行静默安装:给经常重装环境的人
如果你经常要配新机器,或者在虚拟机、CI环境里安装,肯定不想每次都手动点一遍图形界面。这里提供一个可以直接抄作业的命令行安装方式:
vs_BuildTools.exe --quiet --wait --norestart --nocache --installPath C:\BuildTools --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended参数含义解释一下:
--quiet:静默安装,不弹任何界面;--wait:让命令行进程等待安装真正结束,方便脚本往下执行;--norestart:安装完成后不自动重启系统;--installPath C:\BuildTools:指定安装目录,避免塞到系统盘Program Files那一大片路径里;--add Microsoft.VisualStudio.Workload.VCTools:指定添加“C++工具”工作负载;--includeRecommended:顺带安装该工作负载推荐的组件,省得后续缺东少西。
如果你对磁盘空间特别敏感,也可以只添加最核心的编译组件:
vs_BuildTools.exe --quiet --wait --norestart --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows11SDK.22621这种方式装出来大概占用3GB左右,比完整工作负载要节省不少。对于只为了pip编译C扩展的场景,其实完全够用了。
3.4 安装完之后的验证
安装完成以后,务必关闭当前终端窗口,重新打开一个新的PowerShell或cmd窗口,再重新执行之前的pip install命令。因为MSVC的环境变量需要在新的进程里才会加载,旧窗口里直接重试,大概率还是报同样的错。
如果你想确认工具链是否真的装上了,可以试试这个命令:
where cl如果能输出cl.exe的路径,说明编译器已经就绪。不过对大多数普通用户来说,不需要真的手动去碰cl.exe,直接重新装包就是最好的验证。如果你用的是--installPath C:\BuildTools这种方式,也可以到那个目录下看VC文件夹是否存在。
4. 避坑清单:明明装了Build Tools,为什么还是报错
4.1 装了VSCode不算“装了编译器”
第一个高频坑就是把Visual Studio Code当成Visual Studio。VSCode只是一个代码编辑器,它自己不带编译器。你在VSCode里写Python,用的是Python解释器和插件,跟C/C++编译工具链没有任何关系。哪怕你把VSCode的C++插件装了全套,pip也不会因此找到MSVC。这个坑特别容易误导刚入门的朋友,因为“Visual Studio”和“Visual Studio Code”名字实在太像了。
4.2 装了完整Visual Studio却没勾选C++工作负载
第二个坑更隐蔽:你机器上确实装了Visual Studio,但当年安装时只勾了“.NET桌面开发”或“ASP.NET开发”,C++工具集根本没进磁盘。pip的检测逻辑只认编译器组件,不认有没有这软件。解决办法是打开“Visual Studio Installer”,点已安装版本的“修改”,在“工作负载”里补勾“使用C++的桌面开发”,再点“修改”让它把这个组件补装上。
这里给一个快速自查的命令,能在PowerShell里看当前到底装了哪些工具链目录:
Get-ChildItem "C:\Program Files (x86)\Microsoft Visual Studio\2022" -ErrorAction SilentlyContinue如果这个目录下连BuildTools或Community文件夹都没有,说明你装的是VS Code,不是Visual Studio;如果有文件夹但没有VC目录,说明你漏了C++组件。
4.3 装完了,但在旧终端里重试
装了东西以后,Windows的PATH环境变量不会自动广播给已经打开的进程。你重新开一个终端,新进程才会读到最新的PATH。很多人装完Build Tools后,直接在原来的cmd窗口里又跑了一遍pip install,看到同样的报错就以为“安装失败了”,其实只是没重启终端。在任何安装配置类操作之后,重启终端都是最低成本的排查手段。
4.4 32位Python和64位工具链的匹配问题
如果你的Python解释器是32位版本(通常是你下载安装包时选错了架构,或者用了pycharm自带的项目解释器),Build Tools安装时也最好确认包含x86 x64两个架构的编译工具。默认组件VC.Tools.x86.x64会同时带x64和x86的编译能力,一般不会出问题。但如果你用特殊的离线安装命令只装了x64目标,32位Python照样可能报错。另外,现在的Windows生态里,除非有异常老的依赖非要32位环境,否则直接用64位Python会省心很多,很多东西的wheel也都优先发布64位。
4.5 把“运行库”和“编译工具链”搞混了
网上搜这个报错时,经常有人建议去下载“VC运行库合集”(比如vcredist_x64),然后安装。这个做法对我们这个报错没有任何帮助。vcruntime140.dll是程序运行阶段需要的运行库,你的机器上很可能早就有了;而cl.exe、MSBuild.exe这些是编译阶段需要的工具链组件,运行库包里根本没有。两者的关系可以粗暴理解为:运行库是“让你已经编译好的程序能跑起来”,Build Tools是“让你本地能生产新的程序”。报错要求的是后者,别被各种“一键修复运行库”的软件带偏。
4.6 下载慢、安装中断怎么办
Build Tools的安装器默认从微软服务器拉取组件,国内部分网络环境可能会很慢,甚至中途卡死。处理方法有两个思路:一个是先用命令行生成离线安装包(--layout参数),在别的电脑上把需要的组件下载到本地目录,再拷贝到自己机器上安装;另一个是换一个网络条件好的时段重新尝试。微软后续也支持了断点续传,安装中断后重新运行安装器,大部分组件能从缓存继续。
提示:如果安装器反复失败,可以去
%ProgramData%\Microsoft\VisualStudio\Packages目录看看是不是有残留损坏的缓存包,把该目录清空后再重试,成功率会高很多。
5. 不想装Build Tools的备选方案:大多数情况下其实可以绕开
5.1 优先确认有没有可用wheel
如果你只是偶尔遇到一个包装不上,也不打算在本机装一套几GB的编译工具链,可以先试试这个命令,判断当前包到底有没有现成的wheel:
pip install --only-binary :all: 你要装的包名如果这条命令能正常装上,说明PyPI上有wheel,只是之前pip因为某些原因没有优先选择它。如果它报“找不到满足要求的版本”,说明这个包对你当前环境和Python版本组合,确实没有可用的二进制分发,只能源码编译。
还有一种更灵活的做法:直接去PyPI的包详情页,点“Download files”,看看文件列表里有没有符合你条件(cp311、cp312、win_amd64)的.whl文件。比如pandas-1.5.3-cp311-cp311-win_amd64.whl,中间那个cp311就表示CPython 3.11专用,win_amd64表示64位Windows。把对应的whl下载下来,然后:
pip install C:\Downloads\pandas-1.5.3-cp311-cp311-win_amd64.whl完全绕开编译器,直接安装二进制文件。
5.2 用国内镜像站拿预编译包
PyPI在某些网络环境下访问不够稳定,换用国内镜像源经常会有意外惊喜。像清华的PyPI镜像,会在/simple/包名/目录下列出所有可用文件,包括各种whl。镜像站的wheel覆盖情况和官方PyPI基本同步,而且下载速度快很多。配置镜像源也很简单:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple设置完成后,再执行普通的pip install,通常能自动避开很多源码编译场景,下载体验也会明显改善。
5.3 干脆换到conda体系
对于做数据分析、机器学习的朋友,我特别推荐直接用Anaconda或Miniconda,而不是裸Python。conda的包管理器在设计上和pip很不一样,它在channel里会直接提供预编译好的二进制包,不依赖MSVC Build Tools。比如你装mysqlclient、pycryptodome这类在裸Python下经常触发编译的库,在conda里通常是直接下载二进制就能用:
conda install mysqlclientconda的优势不仅在“不用现场编译”,它还会把依赖的底层库(比如libmysql、libxml2)一起管理起来,版本冲突的概率也小很多。对于不想和编译链打交道的普通用户,这条路最省心。
5.4 逃不开编译的场景,还是老实装一套吧
也有一些情况下,你没法用wheel或conda绕开:
- 你想装一个没有Windows wheel的小众新库,它只发布了sdist源码包;
- 你需要自定义编译参数,比如开启OpenMP、静态链接某些第三方库;
- 你在做Python扩展开发,本身就离不开MSVC;
- 项目里大量依赖时效性很高的最新提交版本,GitHub上直接用源码安装。
在这些场景下,一条路走到黑去“找wheel”反而不划算。装一套Build Tools一劳永逸,后面再遇到任何编译相关的问题都不会再拦路。我个人的建议是:如果在近一两个月内,你遇到这种报错的频率超过两次,那就别再犹豫了,直接按第3章流程装完整工具链。工具链体积虽然大,但它解决的是一整个类别的麻烦。
最后再分享一个实操心得:装完Build Tools后,顺手把安装时用的命令行参数记到一个笔记里。以后换新电脑、重装系统,直接复制命令静默安装,比重新点一遍图形界面快得多。我自己在本子上和虚拟机里已经用这套命令装过不下十次,从来不会再被“Microsoft Visual C++ 14.0 or greater is required”卡住过。