Windows下安装Python扩展模块提⽰“Unabletofindvcvarsall.。
。。
本⽂内容
1. Unable to find vcvarsall.bat的问题描述
2. 问题分析
3. 总结
提⽰:如果你只是想知道⾃⼰需要安装哪个版本的Visual Studio请直接查看本⽂最后⼀个⼩节的内容。
⼀、问题描述
我们在windows下通过pip安装⼀些外部Python 模块(⽐如,pycrypto)时通常会遇到安装失败的问题,⽽且会看到类似这样的错误提⽰:error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from aka.ms/vcpython27
如图所⽰:
error: Unable to find vcvarsall.bat
如图所⽰:
⽹上的很多⽂章给出的解决⽅案都安装Visual Studio,但是版本是有要求的,有的说安装Visual Studio 2008,有的说要安装Visual Studio 2010。那么为什么安装Visual Studio就能解决这个问题呢?到底该安装哪个版本的VisualStudio呢?是否有其他解决⽅案呢?这些问题是本⽂讨论的重点,希望⼤家以后遇到这些问题不再有那么多的困惑和慌乱感。
⼆、问题分析
1. 名词解释
我们先对上⾯错误信息中⼏个名词做个简单的介绍:
Microsoft Visual C++ :简称Visual C++、MSVC、VC++或VC,它是微软公司开发的Windows平台下的C++开发⼯具,具有集成开发环境,可以⽤来编辑和编译C、C++以及C++/CLI等编程语⾔。
Microsoft Visual Studio :简称VS,它是美国微软公司的开发⼯具包系列产品,它是⼀个基本完整的开发⼯具集,包含了整个软件⽣命周期中所需要的⼤部分⼯具,如UML⼯具,代码管控⼯具,也包括上⾯这个集成开发环境Microsoft Visual C++。
内部版本号:由上可见VS是包含VC的,另外它们之间版本是有对应关系的,这个对应关系是由微软的内部版本来控制的,上⾯的报错信息 "Microsoft Visual C++ 9.0" 中的 9.0就是Microsoft Visual C++的⼀个内部版本。我们可以根据这个内部版本到对应的VC版本是什么,以及对应的VS版本是什么。
VS与VC及内部版本的对应关系如下:
VS名称内部版本VC名称
Visual Studio  4.0Visual C++ 4.0
Visual Studio 97  5.0Visual C++ 5.0
Visual Studio 6.0  6.0Visual C++ 6.0
Visual Studio .NET 20027.0Visual C++ 2002
Visual Studio .NET 20037.1Visual C++ 2003
Visual Studio 20058.0Visual C++ 2005
Visual Studio 20089.0Visual C++ 2008
Visual Studio 201010.0Visual C++ 2010
Visual Studio 201211.0Visual C++ 2012
Visual Studio 201312.0Visual C++ 2013
Visual Studio 201514.0Visual C++ 2015
Visual Studio 2015 RTM14.0Visual C++ 2015
2. 问题分析
了解了上⾯这些名词以及它们之间关系的之后,我们来分析⼀下本⽂第⼀部分中的错误信息:
1)从上⾯的报错信息来看,是因为不到vcvarsall.bat这个批处理⽂件引起的问题。
2)其中有⼀张截图中提⽰:Microsoft Visual C++ 9.0 is required,说明根本原因是由于没有安装Microsoft Visual C++,且要求的内部版本是 9.0。
3. 答疑解惑
我们⼼⾥可能有⼀些疑惑,看看下⾯有没有你要的答案:
问题1:为什么安装python扩展模块需要安装Microsoft Visual C++呢?
因为有些与操作系统底层密切相关的Python扩展,由于使⽤C/C++ 进⾏代码编写,因此在进⾏安装时需要进⾏C/C++ 代码的编译⼯作,⽽Windows平台的专⽤C/C++ 代码编译⼯具就是Microsoft Visual C++ ,因此Python的模块管理⼯具(如,pip)默认设置的⽤来编译C/C++代码的⼯具就是VC。Linux平台上所使⽤的C/C++ 代码编译⼯具通常都是gcc,因此不涉及安装VS的问题。
问题2:为什么安装Visual Studio可以解决这个问题?
windows开发平台
上⾯已经说明过了,因为Visual Studio中包含Visual C++,安装了Visual Studio之后也就安装了Visual C++。
问题3:为什么有时候安装Visual Studio最新版本都⽆法解决这个问题?
因为我们当前⼤部分使⽤的是CPython,也就是C语⾔实现的Python版本,我们在Windows上安装的Python也是经过VC编译过的可执⾏程序。为了保证扩展模块的兼容性,使⽤Python的模块管理⼯具(如,pip)安装C语⾔实现的外部扩展模块时会默认查并使⽤与编译当前Python时所使⽤的相同内部版本或相互兼容的内部版本的的VC,⽽VS的内部版本与其所包含的VC的内部版本是⼀致的,因此安装的VS版本过⾼或过低都可能会出现问题。
问题4:如何确定需要安装哪个版本的Visual Studio呢?
其实这个问题的本质就是确定需要安装的VS或VC的内部版本。
本⽂开始列出的报错信息中,有⼀个是明确给出了所需要的VC的内部版本的,⽐如
error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from aka.ms/vcpython27
说明需要安装的VC内部版本号是 9.0,从上⾯的版本对应表中可以到,我们需要安装的VS版本是 Visual Studio 2008。
但是对于那些没有明确提⽰所需要的内部版本号的情况,我们怎么确定需要安装哪个版本的VC/VS呢?⽐如
error: Unable to find vcvarsall.bat
我当前的操作系统是Win 10,我安装Python的⽬录是C://Python27,在Python的安装⽬录下可以到这样⼀个Python⽂
件:C://Python27/Lib/distutils/msvccompiler.py,从⽂件名就能看出来这个Python⽂件就是⽤来处理与VC编译器有关的操作的。在该Python⽂件中可以到这样⼀个函数:
def get_build_version():
"""Return the version of MSVC that was used to build Python.
For Python 2.3 and up, the version number is included in
sys.version.  For earlier versions, assume the compiler is MSVC 6.
"""
prefix = "MSC v."
i = string.find(sys.version, prefix)
if i == -1:
return 6
i = i + len(prefix)
s, rest = sys.version[i:].split(" ", 1)
majorVersion = int(s[:-2]) - 6
minorVersion = int(s[2:3]) / 10.0
# I don't think paths are affected by minor version in version 6
if majorVersion == 6:
minorVersion = 0
if majorVersion >= 6:
return majorVersion + minorVersion
# else we don't know what version of the compiler this is
return None
通过注释我们可以知道,这个函数就是⽤来确定编译当前Python所使⽤的VC编译器的版本号的,⽽且注释中告知从Python 2.3版本开
始,VC的版本信息已经包含在sys.version中了,对于Python 2.3之前的版本就认为VC版本号是6。如下图所⽰:
“MSC V.”后⾯那个数字1500就是编译当前Python所使⽤的VC的版本信息,但还不是我们要的那个内部版本号,我们要从这个版本信息中到主版本号majorVersion和次版本号minorVersion,majorVersion + minorVersion的结果才是我们要那个内部版本号。那么这⾥的majorVersion和minorVersion怎么获取到呢?我们可以从上⾯的get_build_version()函数中到答案:
majorVersion = int(s[:-2]) - 6
minorVersion = int(s[2:3]) / 10.0
上⾯代码中的s就是'MSC v.'后⾯那个数字1500,可见:
前两位数减去6就是主版本号,即majorVersion = 15 - 6 = 9
后⾯两位数除以10.0就是此版本号,即00 / 10.0 = 0.0
所以我们可以得到我们要的那个内部版本号:majorVersion + minorVersion = 9 + 0.0 = 9.0。
从上⾯那个版本对应表中可以查到内部版本号9.0对应的VC和VS名称分别是:Visual C++ 2008 和 Visual Studio 2008。
如果你没看明⽩,可以直接看本⽂最后的总结,会列出不同版本的Python对应的内部版本号以及它们与VC和VS的对应关系。
问题5:是否可以只安装VC,不安装VS呢?
可以,请查看详细说明。
问题6:是否有其他解决⽅案?
有的,其实我们的⽬就是在当前Windows系统上安装⼀个与编译当前Python时所使⽤的VC版本⼀致的编译器,⽽微软专门为Python提供了相应的编译器:,我们直接安装这个软件程序就可以了。遗憾的
是,⽬前还没有到Microsoft Visual C++ Compiler for Python 3.x,所以对于Python 3.x,我们还是需要安装Visual Studio 或 Visual C++。或者,抛弃Windows平台吧!
三、总结
1)如果当前使⽤的是Python 2.7,可以安装Visual Studio 2008,也可以安装 Microsoft Visual C++ Compiler for Python 2.7来解决这个问题;
2)如果当前当前使⽤的Python 3.x,只能通过安装相应版本的Visual Studio或Visual C++来解决这个问题。
当然⽹上还有⼀些其他的解决⽅案,⽐如修改上⾯提到的get_build_version()函数,在函数的开始部分给version变量重新赋值来兼容Visual Studio的⾼版本;再⽐如,通过安装MinGW并修改Python扩展包管理程序的配置⽂件,将编译器改为mingw等。这些⽅案个⼈不提倡使⽤,因为可能会带来⼀些其他不可预知的问题。
当前主流Python版本与VC和VS的版本对应关系及各版本VS下载地址:
CPython Visual C++Visual Studio Visual Studio下载地址
2.6, 2.7,
3.0, 3.1, 3.29.0Visual Studio 2008
3.3, 3.410.0Visual Studio 2010
3.51
4.0Visual Studio 2015
Microsoft Visual C++ Compiler for Python 2.7的下载地址在。
问题交流:666948590

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。