Python error Unable to find vcvarsall.bat错误是我在Windows平台下安装Python包时遇到的印象最深刻的问题。整理这篇解决方案的时间还在2012年9月10日。已经九年过去了,相信还有不少的朋友遇到类似的问题。抽空对先前的解决方案进行了重现梳理。主要变更是补充Python2下的解决方案。
目录
问题原因
你安装的包/模块中存在使用cpython写的内容,安装是需要将中间的C语言的代码编译成二进制文件后方可顺利完成安装。Windows环境下默认的编译环境不支持上述编译操作。
解决方案
方案一:选择已经编译好wheel文件进行安装
准备工作:安装wheel支持,pip install wheel
后续内容:寻找对应的.whl安装包(http://www.lfd.uci.edu/~gohlke/pythonlibs/)
安装方法:直接使用pip install xxx.whl 进行安装,其中xxx为文件路径。
注意事项:
- 由于是非官方组织进行编译的,所以并不是所有包都有对应的二进制包
- 选择包时需要确定自己安装的Python的版本及安装的Python是32位的还是64位的
方案二:安装微软的编译环境Visual Studio
Python 2.6 to 3.2
直接安装Visual Studio 2008(测试过,安装完成直接可用,无需配置)或Microsoft Visual C++ Compiler for Python 2.7(未测试)
Python 3.3 and 3.4
安装Windows SDK for Windows 7 and .NET 4.0(未测试)或Visual Studio 2010(安装后需要进行一些配置)
打开“<python安装目录>\Lib\distutils\msvc9compiler.py”,修改msvc9compiler.py文件,将: vc_env = query_vcvarsall(VERSION, plat_spec) 中的VERSION设定为已安装的VS版本对应的值:
- VS2008,则VERSION为0
- VS2010,则VERSION为0
- VS2012,则VERSION为0
- VS2013,则VERSION为0
- VS2014,则VERSION为0
- …
Python 3.5 and later
Visual C++ Build Tools 2015(未测试) 或 Visual Studio 2015
方案三:安装MinGW编译环境
由于安装Visual Studio太占空间了,个人更偏向安装MinGW:
- 下载安装MinGW
- 在MinGW的安装目录下找到bin文件夹,找到mingw32-make.exe,复制一份更名为exe
- 把MinGW的路径添加到环境变量path中,比如我把MinGW安装到D:\MinGW\中,就把D:\MinGW\bin添加到path中;
- 在<python安装目录>\distutils增加文件cfg,在文件里输入以下内容并保存
[build] compiler=mingw32
- 执行原先的模块安装,发现还是报错,报错内容为:error: command ‘gcc’ failed: No such file or directory 解决方案是将D:\MinGW\lib再添加到PATH中。
- 如果安装过程中出现 error: Could not find ‘openssl.exe’ 则直接到https://pypi.org/project/pyOpenSSL/下载安装即可。
- 再次执行时安装模块时,发现如下错误:
D:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall “-ID:\Program Files\Python27\inc lude” “-ID:\Program Files\Python27\include” “-ID:\Program Files\Python27\PC” -c ../libdasm.c -o build\temp.win32-2.7\Release\..\libdasm.o cc1.exe: error:unrecognized command line option ‘-mno-cygwin’ error: command ‘gcc’ failed with exit status 1
原因是gcc 4.6.x 以后不再接受-mno-cygwin为了解决这个问题需要修改<python安装目录>\distutils\cygwinccompiler.py文件。找到:
self.set_executables(compiler='gcc -mno-cygwin -O -Wall', compiler_so='gcc -mno-cygwin -mdll -O -Wall', compiler_cxx='g++ -mno-cygwin -O -Wall', linker_exe='gcc', linker_so='%s -mno-cygwin %s %s' % (self.linker_dll, shared_option, entry_point))
修改为:
self.set_executables(compiler='gcc -O -Wall', compiler_so='gcc -mdll -O -Wall', compiler_cxx='g++ -mno-cygwin -O -Wall', linker_exe='gcc', linker_so='%s -mno-cygwin %s %s' % (self.linker_dll, shared_option, entry_point))
参考链接: