解决unable to find vcvarsall.bat问题

问题

在安装 Python 的第三方库或者编译源码的时候,相信不少人遇到过unable to find vcvarsall.bat 这个错误,网上也有不少的解决办法,但是自己操作一遍之后,发现问题还是没有解决,因此特意记录下我自己解决这个问题的方法。

解决方案

其实解决方法也很简单,有两种:

  1. 安装 Visual Studio
  2. 安装 Visual C++ Build Tools

VS Studio 比较庞大,是个重量级的大家伙,个人更偏向于安装 VC Build Tools,毕竟不是专门用 VS 开发的,安装之后可能需要重启一下系统。

需要注意的是,VS/VC 的版本需要跟编译 Python 所用的 VS/VC 的版本对应, 比如 Python 3.4.1 是用 MSC v.1600 编译的,那么就需要安装 Visual Studio 2010 或者 Visual C++ 2010,可以去微软网站上找得到 MSC 的版本跟 VS/VC 对应关系。这里有一份不完整的列表可以参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MSC v.1000 -> Visual C++ 4.x        
MSC v.1100 -> Visual C++ 5
MSC v.1200 -> Visual C++ 6
MSC v.1300 -> Visual C++ .NET
MSC v.1310 -> Visual C++ .NET 2003
MSC v.1400 -> Visual C++ 2005 (8.0)
MSC v.1500 -> Visual C++ 2008 (9.0)
MSC v.1600 -> Visual C++ 2010 (10.0)
MSC v.1700 -> Visual C++ 2012 (11.0)
MSC v.1800 -> Visual C++ 2013 (12.0)
MSC v.1900 -> Visual C++ 2015 (14.0)
MSC v.1910 -> Visual C++ 2017 (15.0)
MSC v.1911 -> Visual C++ 2017 (15.3)
MSC v.1912 -> Visual C++ 2017 (15.5)
MSC v.1913 -> Visual C++ 2017 (15.6)
MSC v.1914 -> Visual C++ 2017 (15.7)
MSC v.1915 -> Visual C++ 2017 (15.8)
MSC v.1916 -> Visual C++ 2017 (15.9)

那么怎么知道 MSC 的版本信息呢?这个也简单,进入 Python Shell 的时候会有打印信息的。比如像下面这样:

根据打印信息,就可以知道 Python 3.4.1MSC 版本信息。

原因分析

那这个问题的根本原因是什么呢?根本原因应该是安装第三方库的时候,需要编译库的源码,而源码里包含有 C/C++ 的代码。编译 C/C++ 的代码,就需要到对应的编译器,然后就会查找系统安装的编译器,当找不到的时候,就会报 unable to find vcvarsall.bat 这个错误。安装 VS/VC 之后,就安装有 C/C++ 的编译器了,这个错误就不会有了。

不同版本的编译器不一定会兼容,所以就需要安装与编译 Python 时候所用的编译器版本吻合的编译器,不然要不是编译不了,要么是编译出的产物无法使用。一般情况下高版本的编译器向下兼容低版本的编译器,但是反过来就无法兼容,所以可以安装相同的或者更高的版本编译器。