玩Python的朋友,几乎都会在某个深夜撞上这堵墙:pip install一个包,装到一半,屏幕突然甩出一行冷冰冰的英文——error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools"。
我第一次遇到它,是在装psycopg2的时候。当时心里咯噔一下,第一反应是“我缺Python运行库?”,于是满世界找“VC++运行库”下载,装了好几个版本,回来重新执行安装,照样报错。后来才明白,这个报错说的是“你现在没有C++编译器”,而不是“你缺运行环境”。这两个概念差了十万八千里。这篇文章就围绕这个报错,把来龙去脉、正确解法、后续可能遇到的新坑,一次性讲透。
1. 数字背后的含义:14.0不是你想的那个“版本号”
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/很多新手看到“Microsoft Visual C++ 14.0”会以为这是某个软件版本号,于是去下载“Visual C++ 2015”甚至更老的运行库。实际上,这里的14.0指的是MSVC编译器的工具集版本号,它不是产物版本,而是工具链标识。MSVC从Visual Studio 2015开始,编译器主版本号就是14.0;Visual Studio 2017对应14.1x,2019对应14.2x,2022对应14.3x。所以报错里那句“14.0 or greater”,翻译过来就是“你的电脑上需要一个MSVC 2015或更高版本的C++编译工具链”。
这里有个非常容易混淆的点:Python生态里的这个报错只关心MSVC的版本是否≥14.0,跟你是否安装过VC++ 2010、2013这些老运行库没有关系。很多老教程让用户装“VC++ 2015 Redistributable”,结果装完之后问题依旧,原因就在这——Redistributable是运行时,Build Tools是构建工具,两者根本不是一码事。
1.2 为什么pip安装包会突然要C++编译器
要理解这个报错,得先知道pip安装Python包的机制。绝大多数第三方包在PyPI上有两种分发格式:wheel(.whl)和source distribution(sdist,.tar.gz)。wheel是预编译好的二进制包,下载下来解压就能用,不需要本地编译;sdist是源代码包,pip拿到它之后,需要在你机器上调用C++编译器把C/C++扩展编译成当前Python版本可加载的模块。
正常情况下,pip会优先选择wheel安装。但情况不总是这么理想:
- 某些冷门包没有发布对应Python版本或对应操作系统的wheel
- 某些包的wheel仅包含纯净Python代码,但安装时需要编译C扩展
- 某些项目在依赖解析时强制使用源码安装
- Windows + 新Python版本,PyPI尚未及时收录对应wheel
只要pip决定走源码编译路线,它就会在Windows上寻找MSVC编译器。找不到,就抛出你看到的那句报错。简而言之,这个报错的触发点不是“运行库损坏”,而是“系统里根本没有编译工具链”。
1.3 哪些包最容易触发这个报错
不是所有包都会让你装Build Tools。纯Python写的包(比如requests、flask、click)根本不需要编译,走的是纯wheel,永远不会报这个错。容易触发的是带C扩展的程序包:
psycopg2、psycopg2-binary混用lxml、bcrypt、cryptography、gevent、greenletpandas、numpy、scipy(多数情况有官方wheel,但源码构建非常常见)jq、pycurl、pymssql、pyodbc- 某些从GitHub直接
pip install git+...安装的库
我自己统计下来,网络相关、数据库驱动、XML解析、加密算法这四类库最容易踩中。遇到它们时,装好Build Tools几乎是一劳永逸的办法——以后装任何需要编译的包,都不用再被这堵墙卡住。
2. 大多数人卡住的一步:装完运行库仍然报错的真实原因
2.1 运行库与构建工具的区别:车和修车工具的关系
打个比方:VC++运行库(Redistributable)相当于一辆车的备用配件,它能保证引擎运转平滑,但不会给你一个修车工具箱;Microsoft C++ Build Tools相当于全套修车工具,里面有扳手、螺丝刀、引擎诊断仪,也就是实际的编译器、链接器、头文件。
pip install那个报错要的是“修车工具”。你光给它一副全新配件,它压根没法用。你运行一个已编译好的EXE、DLL,需要的是运行库;你要在本地把C源码编译成DLL,需要的是编译器整套工具链。这两件事完全不在一个层次。
2.2 为什么网上的“VC++运行库大礼包”无效
搜索引擎搜“Microsoft Visual C++”,前排链接大概率是各类“运行库合集”“2010-2022一键安装”的帖子。它们确实有用,但解决的是另一类问题——提示“缺少msvcp140.dll”“vcruntime140.dll”这种运行时缺失。而我们遇到的报错,关键字是required(需要),不是missing(缺失)。它需要的是一个编译器存在,而不是某个DLL存在。
判断自己是不是装错了,有一个极其简单的办法:打开命令行,输入:
where cl.exe如果输出提示找不到文件,说明系统里根本没有MSVC编译器。此时你装再多的Redistributable,都不可能让pip满意。
2.3 别把“Build Tools”和“Visual Studio IDE”混为一谈
另外一点:部分老教程让用户安装“Visual Studio Community”整个IDE,这也是可行方案,但属于“杀鸡用牛刀”。
Visual Studio IDE体积巨大,安装包动辄几个GB,还会带一堆用不到的组件。微软官方其实专门提供了一个精简版工具集,叫“Microsoft C++ Build Tools”,它只包含命令行编译器、链接器、必要的头文件和库,没有图形界面,没有IDE,体积小很多。这个工具集才是解决我们当前报错的正解。
3. 动手安装:Build Tools的下载、勾选与验证全流程
3.1 下载入口与版本选择
进入微软官方网站:
https://visualstudio.microsoft.com/visual-cpp-build-tools/页面里通常有两个下载按钮:一个是“Download Build Tools”,另一个是“下载Visual Studio”。务必选前者。下载下来的文件名一般是vs_BuildTools.exe,体积不大,它是一个引导安装器,真正的组件会在安装时连网下载。
这里我先说明一下:不要因为自己的Python是32位,就觉得要选32位工具链;更不要看到“14.0 or greater”就去找老版本。直接安装默认的MSVC v143(对应VS 2022)即可。Python官方给出的所有常见版本,从3.5到3.13,都兼容MSVC v143生成的二进制。
3.2 安装时的工作负载勾选
双击运行vs_BuildTools.exe后,会进入Visual Studio Installer的界面。关键在于加载“工作负载”(Workloads)这一步:
- 勾选右栏第1个:使用C++的桌面开发(Desktop development with C++)
- 在右侧“安装详细信息”中,默认会勾上:
- MSVC v143 - VS 2022 C++ x64/x86生成工具
- Windows 10/11 SDK
- 适用于最新v143构建工具的C++ CMake工具(可选)
- 其他选项如“C++分析工具”“测试工具核心功能”可全部取消勾选,它们和pip编译没有直接关系
这里最容易踩的坑是:只勾了“使用C++的桌面开发”这个大项目,没有留意右侧细节,导致安装时漏掉了实际需要的MSVC编译器组件。建议安装前,在“单个组件”选项卡里搜索MSVC v143,确认x64/x86生成工具在勾选状态。
点击“安装”后,整个过程大约需要5~15分钟,取决于网速和磁盘速度。安装完成后,务必关闭所有命令行窗口,重新打开一个,否则环境变量不会刷新。
3.3 安装完成后的验证方法
重新打开命令行,执行:
cl.exe如果安装正确,会输出:
Microsoft (R) C/C++ Optimizing Compiler Version 19.xx.xxxxx for x64再次执行where cl.exe,也能看到类似这样的路径:
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.xx.xxxxx\bin\Hostx64\x64\cl.exe看到这个路径,说明Build Tools已经成功接入系统。这时候再回去执行之前失败的pip install,绝大多数情况下就能顺利通过编译,安装完成。
4. 安装之后的新问题:cl.exe找不到、pip版本过旧与常见截胡
4.1 装好了却还是报错?先思考环境变量
有朋友反馈,明明装了Build Tools,cl.exe也能手动找到,但pip install还是报同样的错误。这类情况50%以上是环境变量没刷新或者在原来的命令行窗口里继续执行。Windows下,VS Installer会把vcvarsall.bat等脚本写入系统,但已打开的命令行窗口不会自动加载最新环境变量。最简单有效的操作:关掉所有终端(包括IDE内嵌终端),重新开一个。
如果新终端里执行cl仍然提示找不到,但你知道它在哪个路径,可以用CD进入编译器目录手动执行,确认能运行。更推荐的是安装后重启一次会话,或者在当前窗口执行:
call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"它能手动加载当前终端的VC环境变量。加载后再执行pip install,基本必过。
4.2 旧版本Python、pip版本与新工具链的关系
第二个高频坑是pip版本过旧。老版本pip在解析源码包时,可能无法正确识别新MSVC工具链的版本信息,即使编译器已经存在,它也会误判并拒绝编译。
安装后建议先升级pip:
python -m pip install --upgrade pip如果你用pip3而不是pip,注意先确认当前Python路径是预期版本。另外,Python 3.8以下的老版本,官方虽然声称支持VS2015以上的编译器,但实际编译部分高版本C扩展源码时,会因为C++标准问题失败。这种场景下,最快的方式不是继续跟编译器较劲,而是升级Python版本,或者改用第5章提到的conda路线。
4.3 已经装了VS IDE,为什么还是编译失败
不少开发者机子上装了Visual Studio Community。但注意两点:
- 如果安装VS时**没有勾选“使用C++的桌面开发”**工作负载,只有.NET或其他组件,那你的系统里依然没有cl.exe
- 即使勾选了,也可能因为环境变量未刷新而被pip无视
此时在Visual Studio Installer中修改安装,补上“使用C++的桌面开发”,然后重启终端即可。在VS和Build Tools同时存在的情况下,cl.exe版本可能存在多个,PATH里先出现哪个就会用哪个。通常这个差异影响不大,但如果后续编译报“版本不匹配”,可以考虑在终端里手动执行相应版本的vcvars64.bat来统一环境。
4.4 编译中途的额外报错:不要慌着重装
Build Tools装好之后,pip install可能还会出现fatal error C1083: Cannot open include file、LNK1104: cannot open file python39.lib这类编译错误。这时的问题往往不在编译器,而在于:
- CPython开发头文件缺失(某些源码包需要
python-dev,Windows下通常已内置在Python安装目录中) - 缺少第三方依赖库(比如编译
lxml需要libxml2,编译pillow需要zlib) - 磁盘权限不足,无法写入临时编译目录
遇到这种报错,先看Include和LNK的具体文件名,再针对性补齐。绝大多数情况下,不要盲目重装Build Tools,那只会浪费时间。
5. 绕过编译器的三条活路:conda、wheel与Linux/macOS的等价操作
5.1 为什么conda几乎遇不到这个报错
如果你是数据分析方向的,强烈建议改用conda(Anaconda/Miniconda)管理环境。conda install和pip install的工作机制完全不同:conda从conda-forge等渠道拉取的是预编译二进制的conda包,里面已经包含编译好的.pyd/.so文件,根本不需要本地C++编译器。
我自己电脑是Windows,装pandas这类大型科学计算库时,pip install偶尔会触发源码编译,换成conda install,几秒钟就装好了,全程安静得像什么都没发生。所以,如果条件允许,优先用conda装带C扩展的库,直接绕开整条编译链路。
5.2 Linux/macOS上的对应报错和等价方案
这个报错不是Windows专属,Linux/macOS也有类似教训:
- Linux上会报
gcc: command not found或error: command 'gcc' failed with exit status 1 - macOS上会报
xcrun: error: invalid active developer path...(经典地需要安装Xcode Command Line Tools)
等价解法分别是:
# Debian/Ubuntu 系 sudo apt install build-essential python3-dev # macOS xcode-select --install原理与Windows版一致——机器上缺编译链。装了以后,pip install该编译的就能正常编译了。在Linux/macOS下,也可以优先考虑wheel或conda,避免每次都要编译。
5.3 找“预编译wheel”这里有一个简单判断逻辑
并不是所有包都值得你去折腾编译器。遇到报错时可以先去PyPI页面上看该包的文件列表:
- 如果存在
xxx-cp39-cp39-win_amd64.whl这类的文件,说明官方已经为Python 3.9 + Windows 64位准备了预编译包 - 报错往往说明:当前Python版本太新(比如3.13还没有官方wheel),或者你的平台架构特殊(比如32位Python)
一个实用命令:
pip install --only-binary :all: 包名它能强制pip只使用wheel,禁止尝试源码编译。如果这个命令顺利跑完,说明你之前缺的是wheel而不是编译器,问题另有蹊径;如果它直接报“找不到满足要求的版本”,那就说明确实没有wheel可选,才需要走编译路线。
顺带一提,一些开源项目还提供“非官方预编译wheel”,作者会为最新的Python版本或特殊平台提前编译好二进制包。使用这类来源时,注意核对包名、Python版本、系统架构是否匹配,并留意信誉。
6. 个人实践中的几点体会
这个报错我前前后后见过几十次,最后总结下来,每个人的解法其实相差不大:装Build Tools的装Build Tools,换conda的换conda。区别在于能不能一次趟过,少走弯路。
几点实在建议:
- 装好Build Tools之后,尽量保持安装包常驻。以后升级Python版本、装新库,再遇到编译需求,已经不用再报错。
- 看到任何关于“VC++ 201X”的报错,先搞清楚是谁需要的。如果是
pip install,它要的是编译器;如果是双击运行程序提示缺msvcp140.dll,它要的是运行库。两者别混。 - 如果某个包实在编译不过,不要死磕。上PyPI或者conda-forge找找有没有更适合当前平台的预编译版本,往往五分钟内解决问题。没有人规定所有包都必须从源代码现场编译。
- Windows上的Python开发,补一个
vcvars64.bat调用习惯,对排查编译类问题有奇效。遇到环境变量相关的疑难杂症,先手动call它,再执行原命令,很多问题当场就消失了。
希望这篇文章能帮你把这堵“14.0 or greater”的墙拆掉,以后Python装包的路顺畅一些。