windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)


Posted in Python onFebruary 21, 2018

N久没有开始写博客了,总觉得要随便记点东西,岁月蹉跎,曾经搞得一些东西、技术、工具,说丢也就丢了,点点滴滴还是要记录一下吧。。。

在windows下使用pip安装一些python的第三方库,有很多使用C写了一些扩展,需要使用VC++ Compiler 来编译安装(也可使用MInGW,一般不推荐),否则就会出现“Unable to find vcvarsall.bat”。像Python2.7就需要使用VS2008 C++ compiler , 而python3至python3.4 (python3.5 将采用VS2015)采用VS2010 编译生成。但是,凡安装过VS这个巨无霸的臃肿IDE的都知道,附带捆绑一大堆你不知道有没有用的Microsoft 的插件,占据大量的C盘空间,启动又慢,虽然IDE的界面功能勉强过得去。如果电脑配置一般的话,这东西就搞得N个卡,一般不做相关开发的,就没必要去安装整个VS。 对于Python 2.7 来说,微软还算有良心,直接推出了Microsoft Visual C++ Compiler for Python 2.7,下载直接安装即可。然后,在开始菜单-》所有程序里面,找到对应的目录,根据的你的平台和python版本(选x86或x64)点击对应的Command Prompt运行。 这个cmd窗口里面,可以输入set命令查看一下环境变量,发现,已经设置好了INCLUDE=, PATH=, LIB=, and LIBPATH=这几个参数,于是直接输入

pip install numpy

就可安装编译对应的第三方模块、库了,有时编译过程比较漫长, 需耐心等待。

    而对python3 来说, 则没有这么方便了,由于我的Python3.4 是64位,显然直接用VS2010 Express也不行了,因为它默认只有x86版本的,没有64位的。参考一下Stackoverflow中一篇问答:

       Python PIP has issues with path for MS Visual Studio 2010 Express for 64-bit install on Windows 7

    根据上面提出的建议,我在本机上得到对应解决方案。先安装VS2010 Express ,然后再安装windows SDK 7.1  ,最后也要安装一个64位compiler的补丁;

    

 Microsoft SDK 7.1 (Windows 7) 

    

 VC-Compiler-KB2519277

     PS:在安装SDK 7.1 之前,请先卸载 VC redistribute 2010 相关(包括X86 和 X64)组件包,否则安装报错。

    完成上述步骤之后,基本的MSVC的编译环境(包含x64)就已经配置好了,但是如果你在以后编译项目的时候,比如在构建Qt5项目时,会出现出现以下错误:

     c:\program files (x86)\microsoft visual studio 10.0\vc\include\intrin.h(26): fatal error C1083: Cannot open include file: 'ammintrin.h': No such file or directory

    此时则可以到网上下载对应 ammintrin.h ,放到 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\目录下即可,可在下面的这篇百度文库里下载:

ammintrin.h头文件,Windows SDK 7.1安装KB2519277补丁后必备

    安装完毕之后,在开始菜单里面,找到“Windows SDK 7.1 Command Prompt”, 点击运行,在shell下可以通过SetEnv 来设置对应的编译环境,如下图:

windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)

设置“setenv /x64” 之后,即可在64位编译环境下pip install 对应的包。

到了这里,可能需要提一下,搭建好环境后,分别在python 2.7 和 python 3.4 里面安装numpy,发现py2没问题,py3却安装编译link失败(之前都在虚拟机里面测试了一下,py3安装是没问题的),这是为何呢? 请对比一下下面两幅图:

windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)

windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)

显然py2安装的时候,link命令行下的libpath使用“”引起来了,所以路径有空格不会把参数隔断,而py3就没这么细致了,不知道是pip、setuptools调用cmd命令的缺心眼,还是distutils里面的bug,反正py3的安装路径不能有空格。于是调整了一下python3的安装路径,也就是不含空格,就编译成功了。

当然这只是搭建好了VC++ 的编译环境,对于像SciPy这样的数值计算库,安装的话需要Fortran的编译器。显然windows下的编译安装远没有linux下的简单方便(除了包名不好记,包依赖比较麻烦),gcc、gfortran现成的,apt-get 里面也有现成的。 所以在windows下开发测试的话,可以直接在这个加州大学尔湾分校(UCI)提供的大量已编译打包好的针对windows的wheel安装包,上面有Numpy、SciPy、matplotlib等等数值分析、科学计算的模块库,并且还都是 MKL 版的。下载对应的版本,直接用“pip install xxxx.whl”即可完成安装,whl文件其实就跟zip文件一样,打包压缩一下而已,你也直接用压缩软件解开,将其放到对应的Lib/site-packages目录下即可。Of course,你也可以使用 Anaconda 这样的python定制环境版本,里面已将上面的包直接集成了,包括像IPython这么好用的REPL工具,以及conda 包管理。

Python 相关文章推荐
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
Python 编码处理-str与Unicode的区别
Sep 06 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
Python管理Windows服务小脚本
Mar 12 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
Keras实现将两个模型连接到一起
May 23 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 #Python
基于Django用户认证系统详解
Feb 21 #Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 #Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 #Python
python中abs&map&reduce简介
Feb 20 #Python
Python中常见的异常总结
Feb 20 #Python
Python中单例模式总结
Feb 20 #Python
You might like
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
浅析Python中的多重继承
2015/04/28 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
Python操作Excel的学习笔记
2021/02/18 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
国旗下的讲话演讲稿
2014/05/08 职场文书
班主任自我评价范文
2015/03/11 职场文书
自我评价优缺点范文
2015/03/11 职场文书
《西门豹》教学反思
2016/02/23 职场文书
AJAX学习笔记
2021/05/18 Javascript