生成pyd文件时提示“Unable to find vcvarsall.bat”的问题
本文内容
- Unable to find vcvarsall.bat的问题描述
- 问题分析
- 总结
一、问题描述
我们在windows下通过pip安装一些外部Python 模块(比如,pycrypto)时通常会遇到安装失败的问题,而且会看到类似这样的错误提示:
error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://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.0 | Visual C++ 4.0 |
Visual Studio 97 | 5.0 | Visual C++ 5.0 |
Visual Studio 6.0 | 6.0 | Visual C++ 6.0 |
Visual Studio .NET 2002 | 7.0 | Visual C++ 2002 |
Visual Studio .NET 2003 | 7.1 | Visual C++ 2003 |
Visual Studio 2005 | 8.0 | Visual C++ 2005 |
Visual Studio 2008 | 9.0 | Visual C++ 2008 |
Visual Studio 2010 | 10.0 | Visual C++ 2010 |
Visual Studio 2012 | 11.0 | Visual C++ 2012 |
Visual Studio 2013 | 12.0 | Visual C++ 2013 |
Visual Studio 2015 | 14.0 | Visual C++ 2015 |
Visual Studio 2015 RTM | 14.0 | Visual 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可以解决这个问题?
上面已经说明过了,因为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 http://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 2.7,我们直接安装这个软件程序就可以了。遗憾的是,目前还没有找到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.2 | 9.0 | Visual Studio 2008 | x86下载 x64下载 |
3.3, 3.4 | 10.0 | Visual Studio 2010 | x86下载 x64下载 |
3.5 | 14.0 | Visual Studio 2015 | 下载 |
Microsoft Visual C++ Compiler for Python 2.7的下载地址在这里。
生成pyd文件时提示“Unable to find vcvarsall.bat”的问题的更多相关文章
- Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题
解决Python安装包时提示Unable to find vcvarsall.bat的问题 by:授客 QQ:1033553122 问题 Python安装包时,提示Unable to find v ...
- Windows下安装Python扩展模块提示Unable to find vcvarsall.bat的问题
本文内容 Unable to find vcvarsall.bat的问题描述 问题分析 总结 提示: 如果你只是想知道自己需要安装哪个版本的Visual Studio请直接查看本文最后一个小节的内容. ...
- Windows下安装Python扩展模块提示“Unable to find vcvarsall.bat”的问题
本文内容 Unable to find vcvarsall.bat的问题描述 问题分析 总结 提示: 如果你只是想知道自己需要安装哪个版本的Visual Studio请直接查看本文最后一个小节的内容. ...
- 解决proto文件生成pb文件时提示(e.g."message")的问题
原因:格式不支持 解决办法:去下个notepad,打开方式选择notepad,文件属性的只读取消掉 打开后会发现最下面显示了文件的格式是unix,utf-8 右键红框处,选择转换为windows格式, ...
- Python3.4 用 pip 安装lxml时出现 “Unable to find vcvarsall.bat ”
我的python版本是Python 3.5 该问题的产生是在windows环境中,python 的 Setup需要调用一个vcvarsall.bat的文件,该文件需要安装c++编程环境才会有.网上的方 ...
- Python3.5 用 pip 安装lxml时出现 “Unable to find vcvarsall.bat ”?(转载)
来自:https://www.zhihu.com/question/26857761 解决步骤: 1. 安装wheel,命令行运行: pip install wheel 2.在这里下载对应的.whl文 ...
- pandas安装过程中提示unable to find vcvarsall.bat的解决方法
转载自:http://blog.csdn.net/qq_21144699/article/details/46849561 为这位老兄点赞 原帖参考:http://stackoverflow.com/ ...
- windows下python3.4安装lxml提示"Unable to find vcvarsall.bat"
"https://pypi.python.org/pypi/lxml/3.6.0"从这个网址直接下载对应的lxml包,exe格式的,直接安装,问题解决!
- error: Setup script exited with error: Unable to find vcvarsall.bat
安装mxnet python版本时遇到“Unable to find vcvarsall.bat”错误搜索一下后查到如下方法: python 3.5.2版本依赖高版本的vs解决办法是安装vs2015的 ...
随机推荐
- springboot 事务回滚
在springboot中,使用事务回滚时,添加@Transactional注解,然后在try-catch块中,发生异常时,在catch中 添加 TransactionAspectSupport.cur ...
- kali meterpreter中mimikatz模块获取密码
kali这方面不说了, meterpreter也略过, 做个关于mimikatz的笔记. mimikatz模块, 能获取对方机器的密码(包括哈希和明文). 渗透模块怎么进的也不说了, 方式太多, 我用 ...
- http请求记录
Request Headers 请求头 Content-Type 默认值: "application/x-www-form-urlencoded".发送信息至服务器时内容编码类型 ...
- topcoder srm 540 div1
problem1 link 设第一个数字为$x$,那么第2到第$n$个数字都可以表示成$a+bx$的形式,其中$b=1$或者$b=-1$.然后可以求出关于$x$的一些范围,求交集即可. problem ...
- Django框架(八) Django之ORM数据库操作
创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...
- Python 正则表达式学习
摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2, ...
- 大臣的旅费|2013年蓝桥杯A组题解析第十题-fishers
标题:大臣的旅费 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市 ...
- javbus爬虫-老司机你值得拥有
# 起因 有个朋友叫我帮忙写个爬虫,爬取javbus5上面所有的详情页链接,也就是所有的https://www.javbus5.com/SRS-055这种链接, 我一看,嘿呀,这是司机的活儿啊,我绝对 ...
- 【Dalston】【第七章】分布式链路跟踪(Sleuth)
当我们进行微服务架构开发时,通常会根据业务来划分微服务,各业务之间通过REST进行调用.一个用户操作,可能需要很多微服务的协同才能完成,如果在业务调用链路上任何一个微服务出现问题或者网络超时,都会导致 ...
- (转)Awesome PyTorch List
Awesome-Pytorch-list 2018-08-10 09:25:16 This blog is copied from: https://github.com/Epsilon-Lee/Aw ...