Python 安装扩展包时,需要用到的编译器问题

Python3.4 用 pip 安装lxml时出现 “Unable to find vcvarsall.bat ”?

我在网上搜了好多,说需要安装 vs2008,但是我安装了vs2008专业版,依然还是这个问题“Unable to find vcvarsall.bat…
关注者
160
被浏览
32369
16 个回答
建议直接装编译好的安装包:
lfd.uci.edu/~gohlke/pyt
今天花了一天的时间解决这个问题!基本把网上说的方法都试了,什么注册表,改keytool,装了vs2010等等,最后是看python源代码解决的。

我的python版本是Python 3.5

该问题的产生是在windows环境中,python 的 Setup需要调用一个vcvarsall.bat的文件,该文件需要安装c++编程环境才会有。网上的方法有两个:一、安装MinGW;二、安装Visual Studio 。我用的是第二种方法。

步骤一:

在你的python程序所在文件夹中找到:“_msvccompiler.py”文件,例如我的电脑中的路劲是:

D:\Program Files\Anaconda3\Lib\distutils\_msvccompiler.py

找到后用编辑器打开,找到“_find_vcvarsall”函数声明中类似“if version >=14 and version > best_version:”注意这里的“14”,如果这里是14说明VS版本要在14以上才可以。所以根据这句,我们要安装最新的Visual Studio2015。(相对的如果是9就是9以上即可这时VS10什么都是可以的)


步骤二:

现在Visual Studio 2015有社区版,可以免费使用,这个版本就够了。为了方便大家,我放在云盘。你也可以去官网下载。

pan.baidu.com/s/1eSueWL


下载完毕后进行安装:

注意一定要勾选c++环境,和XXXfor python,这两个。web development应该是没有影响的,但是由于这是软件默认勾选的,所以我也装了。

这一步,出现了一直停留在“Configuring Your System”的问题,然后在网上找到了如下解决方案:(Visual Studio Express 2013 for windows with update 2 installation Taking Too much time in "Configuring Your System"

意思就是把VS的进程都关了。我关掉VS2015后分分钟就好了

刚从这个大坑里爬出来:


1. 安装wheel,命令行运行:

pip install wheel

2.在这里下载对应的.whl文件,注意别改文件名!

lfd.uci.edu/~gohlke/pyt

Ctrl + F,输入lxml,找到下面这段

Lxml, a binding for the libxml2 and libxslt libraries.
lxml‑3.4.4‑cp27‑none‑win32.whl
lxml‑3.4.4‑cp27‑none‑win_amd64.whl
lxml‑3.4.4‑cp33‑none‑win32.whl
lxml‑3.4.4‑cp33‑none‑win_amd64.whl
lxml‑3.4.4‑cp34‑none‑win32.whl
lxml‑3.4.4‑cp34‑none‑win_amd64.whl
lxml‑3.4.4‑cp35‑none‑win32.whl
lxml‑3.4.4‑cp35‑none‑win_amd64.whl
cp后面是Python的版本号,27表示2.7,根据你的Python版本选择下载。


3. 进入.whl所在的文件夹,执行命令即可完成安装

pip install 带后缀的完整文件名

!!!!python35已不适用以下方案

----------原答案-----------
C:/Python31/Lib/distutils目录下,发现“unable to find vcvarsall.bat”这句话在msvc9compiler.py中
问题出在构建python的版本和你计算机上安装的版本可能不一样。
具体修改代码如下:
msvc9compiler.py中
修改MSVCCompiler函数:
vc_env = query_vcvarsall(VERSION, plat_spec)
为:
如果安装的是VS2014,则VERSION为13.0;
如果安装的是VS2013,则VERSION为12.0;
如果安装的是VS2012,则VERSION为11.0;
如果安装的是VS2010,则VERSION为10.0;
如果安装的是VS2008,则VERSION为9.0。
像我的安装的是VS2013,则
vc_env = query_vcvarsall(12.0, plat_spec)

在我的电脑上,我查过它查找的VERSION为10.0,也就是VS2010,所以要人工干预下,而且修改此处对整个程序没有影响,除非你换了VS版本

至于题主为啥2008版的没用,因为Python3.4默认2010版,你也可以直接下2010的,这就不用改了

泻药,以下回答不保证是正确的。

1 直接下载预编译好的二进制安装包。

2 那个玩意是vc里的,我记得这里有个vc版本问题,这个文件名好像不一样,你进去安装包里,看看实际用的是哪个脚本,找不到可能要添加环境变量。提示:这个是可以配置成使用mingw的,也是安装脚本setup.py里配置的,如果你最后没搞定,可以尝试改成使用mingw。

3 换linux 使用系统带的包管理器装,通常问题不大。
微软社区的开放者对这个问题给出了答复。一句话:对于python,3.4 安装Windows SDK for Windows 7 and .NET 4.0(或者 Visual Studio 2010) 。对其他版本,见表:

引自 https://blogs.msdn.microsoft.com/pythonengineering/2016/04/11/unable-to-find-vcvarsall-bat/

产生原因:

python3.4用的是msvs2010编译的,所以python3.4默认只能认出msvs2010。

python2.7用的是msvs2008编译的,所以python2.7默认只能认出msvs2008.

方法一:安装mingw(不推荐)

下载mingw环境,添加环境变量

或者使用

python setup.py build –compiler=mingw32

方法二:安装对应版本的msvs

python2安装msvs2008,python3安装msvs2010


方法三:设置变量

python2 在安装扩展前执行

SET VS90COMNTOOLS =  [vcvarsall.bat所在的目录]

或者

SET VS90COMNTOOLS=%VS120COMNTOOLS%

在湖闻樟注:VS120COMNTOOLS改成你安装的msvs版本对应的

python3在安装扩展前执行

SET VS100COMNTOOLS =  [vcvarsall.bat所在的目录]

或者

SET VS100COMNTOOLS=%VS120COMNTOOLS%

在湖闻樟注:VS120COMNTOOLS改成你安装的msvs版本对应的


方法四:修改安装脚本

打开

[python3安装目录]Lib/distutils/msvc9compiler.py

修改MSVCCompiler函数:

vc_env = query_vcvarsall(VERSION, plat_spec)

为:

vc_env = query_vcvarsall(12.0, plat_spec)

在湖闻樟注:12.0改成你安装的msvs对应的版本号

补充:

msvs2005版本号为8.0对应环境变量VS80COMNTOOLS

msvs2008版本号为9.0对应环境变量VS90COMNTOOLS

msvs2010版本号为10.0对应环境变量VS100COMNTOOLS

msvs2012版本号为11.0对应环境变量VS110COMNTOOLS

msvs2013版本号为12.0对应环境变量VS120COMNTOOLS
----------------------------------------------------------------------------------------------------------------------
python3.5升级了distutils,默认使用_msvccompiler.py ,变动有些大,上面说的修改msvc9compiler.py的办法没有效果,另外比较推荐使用编译好的二进制包来安装,毕竟省事嘛。

直接按 @知乎用户给的链接下二进制包就行。

python在windows下通过pip安装带有c扩展的包时,如果是python 2.7,需要vs2008,如果是python 3.x,需要vs2010,版本错了都不行,更别提mingw。因为c运行时不兼容的原因。

还有两个一劳永逸的解决方案:
1. 换linux
2. 用 Anaconda Scientific Python Distribution
赞同 的答案
但是,如果pip版本不是最新的可能遇到问题
win7 x64, python 3.5.1 x64, lxml-3.6.4-cp35-cp35m-win_amd64.whl
偏偏就提示版本不对
lxml-3.6.4-cp35-cp35m-win_amd64.whl is not a supported wheel on this platform.
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
运行 python -m pip install --upgrade pip 升级pip后就好了。
直接提示必须升级pip就好了,还搞得这么含蓄。
额, 如果有人还看到这里,那你试一下这样:
按照 深海鱼 的方法下载到whl文件,然后重命名为zip,解压后放到python安装目录下的lib中。
感谢@许仙的回答,我这里补充一下,安装whl文件需要使用cmd进入python/Scripts/。然后运行 pip3.4 install xxxxx.whl(针对3.4版本)

今儿一天就耗在这儿上了,不过好在终于解决了。

先说下自己走了哪些然而没有什么卵用的弯路:上午试图用安anaconda的方式绕过报错,但是无用;安了一下午Visual Studio 2015,然而重启之后还是报错;然后就开始暴力改环境变量,SET VS90COMNTOOLS=%VS140COMNTOOLS%,and发现环境变量里还有个VS140COMNTOOLS指向了C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\,继续然并卵;再然后在“..python安装路径...\Lib\distutils目录下有个msvc9compiler.py找到243行,toolskey = "VS%0.f0COMNTOOLS" % version 直接改为 toolskey = "VS140COMNTOOLS‘。。。

最后说下咋解决的吧,很令人崩溃的事实是真相是重新安装pip/setuptools/virtualenv
执行以下语句就好了:
  1. python -m pip install -U pip
  2. pip install -U setuptools
  3. pip install -U virtualenv

然后我的jupyter notebook终于跳了出来,哎

真的,我觉得下次再遇到这种问题直接卸掉windows改Ubuntu,然后直接装anaconda。windows的底层环境跟Python真是八字不合。
ps.话说情人节这天大家都在撒狗粮吃狗粮,只有我在单位捣鼓报错,怪不得我是单身狗:)
说一下我的(Python 3.5)解决方法,按@深海鱼的方法安装wheel后仍显示“Unable to find vcvarsall.bat ”,按照WindowsCompilers - Python Wiki的说明,在安装Visual Studio 2015时勾选了(已经安装的可以选择修改,添加所需功能)
  • 编程语言->针对Visual Studio的Python工具
  • Windows和Web开发->通用Windows应用开发工具->Widows 10 SDK
  • Windows和Web开发->Windows 8.1和Windows Phone 8.0/8.1工具(应该是可选项

安装完成后,升级pip安装程序:pip install --upgrade setuptools
再次尝试安装后就没问题了

如果仍然不行,尝试安装“Microsoft Visual C++ Compiler for Python 2.7”Microsoft Visual C++ Compiler for Python 2.7,再次尝试(在安装wheel的前提下)。。

#知其然,不知其所以然#希望有所帮助,也欢迎指教#
pip install scrapy死活不成功,改用conda install scrapy就好了....
本人亲测,以下方法有效:
Python 2.7 会搜索 Visual Studio 2008.
如果你电脑上没有这个版本的话,比如只有:
1.Visual Studio 2010,在cmd里面执行:
SET VS90COMNTOOLS=%VS100COMNTOOLS%
2. Visual Studio 2012 的话:
SET VS90COMNTOOLS=%VS110COMNTOOLS%
以此类推:
3. Visual Studio 2013 的话:
SET VS90COMNTOOLS=%VS120COMNTOOLS%
4. Visual Studio 2003 的话:
SET VS90COMNTOOLS=%VS80COMNTOOLS%
方法来源于百度
少年,如果你有更高级的VS,比如2015的话,设置路径要设置到WIN sdk的目录,我的版本是7.1,编译器在那里。
当然,有些库编译的时候需要额外的东西,比如mysql的头文件,这个我的办法也解决不了,可以去安装编译好的。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值