器→工具, 编程语言

Python error Unable to find vcvarsall.bat

钱魏Way · · 1,564 次浏览

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))

参考链接:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注