Windows 8.1、7企业版和7家庭版下安装numpy时pip的编译问题
我在我的电脑上用Python 3.4安装numpy时遇到了问题,使用命令pip install numpy时总是出现各种编译错误(这个问题只在64位的Python安装上出现)。
这个问题已经被很多人提到过,我之前也有过一个相关的问题,关于找不到vcvarsall.bat。我在三台不同的干净机器上测试过,分别是Windows 8.1、7企业版和7家庭版,结果都是一样的。
安装Visual Studio 2010 Express C++可以解决第一个错误,也就是找不到vcvarsall.bat的问题,但接下来又出现了一个以ValueError结尾的异常,如下所示:
File "C:\Python34\lib\distutils\msvc9compiler.py", line 371, in initialize
vc_env = query_vcvarsall(VERSION, plat_spec)
File "C:\Python34\lib\distutils\msvc9compiler.py", line 287, in query_vcvarsall
raise ValueError(str(list(result.keys())))
ValueError: ['path']
然后我按照这个建议,在讨论论坛中修补了文件,结果出现了一个KEY_BASE错误。
File "C:\Users\Matej\AppData\Local\Temp\pip_build_Matej\numpy\numpy\distutils\command\config.py", line 18, in <module>
from numpy.distutils.mingw32ccompiler import generate_manifest
File "C:\Users\Matej\AppData\Local\Temp\pip_build_Matej\numpy\numpy\distutils\mingw32ccompiler.py", line 36, in <module>
from distutils.msvccompiler import get_build_version as get_build_msvc_version
File "C:\Python34\lib\distutils\msvccompiler.py", line 638, in <module>
from distutils.msvc9compiler import MSVCCompiler
File "C:\Python34\lib\distutils\msvc9compiler.py", line 71, in <module>
r"v%sA"
File "C:\Python34\lib\distutils\msvc9compiler.py", line 67, in <listcomp>
WINSDK_PATH_KEYS = [KEY_BASE + "Microsoft SDKs\\Windows\\" + rest for rest in (
NameError: name 'KEY_BASE' is not defined
根据同一个链接的建议,我在msvc9compiler.py中调用变量之前添加了KEY_BASE
的定义:
KEY_BASE = r"Software\Microsoft\\"
这导致了我无法解决的最终错误:
File "C:\Users\Matej\AppData\Local\Temp\pip_build_Matej\numpy\numpy\distutils\command\build_src.py", line 164, in build_sources
self.build_library_sources(*libname_info)
File "C:\Users\Matej\AppData\Local\Temp\pip_build_Matej\numpy\numpy\distutils\command\build_src.py", line 299, in build_library_sources
sources = self.generate_sources(sources, (lib_name, build_info))
File "C:\Users\Matej\AppData\Local\Temp\pip_build_Matej\numpy\numpy\distutils\command\build_src.py", line 386, in generate_sources
source = func(extension, build_dir)
File "numpy\core\setup.py", line 682, in get_mathlib_info
raise RuntimeError("Broken toolchain: cannot link a simple C program")
RuntimeError: Broken toolchain: cannot link a simple C program
我尝试了以下方法,但都没有解决Broken toolchain
的错误:
- 这个链接,里面有对msvc9compiler.py的进一步修补
- 这个链接,是Peter Cock提供的(这个方法适用于32位的Python 3.4安装)
- 尝试使用
easy_install
安装,因为有用户建议这样可能会成功
注意1:我知道可以使用这个网站上的编译好的二进制文件作为变通方法,但我特别想找一个使用distutils的解决方案,如果有的话。
注意2:错误日志明显更长,我为了可读性进行了剪切。
4 个回答
我觉得最简单的解决办法就是打开Visual Studio的命令提示符(你不需要其他的修复,只要最新版本的Python 2或3就可以了)。
具体来说,在你的开始菜单里,应该有一个类似“Visual Studio命令提示符(2010)”的选项。打开这个程序(它会打开一个命令提示符窗口),然后在命令提示符里输入:
pip install numpy
备注:
1) 不同版本的Python需要用不同版本的Visual Studio来编译。我觉得Python的开发者是希望你用2010版本来编译(我可能记错了),所以如果你尝试打开Visual Studio 2013的命令提示符,可能会不太管用。也有可能最新版本的Python换了编译器,但我建议你先试试2010的命令提示符。
2) 你可能会有多个命令提示符的选项。我用“Visual Studio命令提示符(2010)”这个最基本的版本就成功了。
3) 要安装Python 3.4,我可以直接打开一个普通的命令提示符,然后
pip install numpy
但对于Python 2.7,我就得用这个命令提示符的小技巧了。
如果你按照之前的步骤还没有解决问题,可以试试这个简单的方法,这个方法帮我成功安装了numpy:去Jurko的代码库,里面有他为使用MSVC编译而修复和改进的脚本,下载或复制粘贴这些文件:
msvc9compiler.py
msvccompiler.py
链接:
把这些文件保存到你Python安装目录下的'\Lib\distutils\'文件夹里,比如: "C:\WinPython-64bit-3.4.3.2\python-3.4.3.amd64\Lib\distutils"。
还有其他一些解决方案可以帮助你解决用pip或easy_install安装Python模块时遇到的问题,比如: 错误:无法找到vcvarsall.bat 和 在Windows 8中使用Python 3.3时无法找到vcvarsall.bat,这些问题有时看起来很难解决。
我的系统是:Windows 7,Windows SDK 7.1,VS2010 Express带SP1,Python 3.4.3,64位。
虽然接受的答案可以解决问题,但对一个经过验证的库进行这样的修改其实是多余的。
要从根本上解决这个问题:只需将 (x86 或 x64 - 根据你的目标选择) Microsoft Manifest Tool (mt.exe) 添加到你的路径中,然后通过 pip 安装 numpy。
自从 Visual Studio 2017 以来,mt.exe 已经移到了 Windows SDK 7.1/8.1/10 中,这个 SDK 需要先安装。
我的 mt.exe (x86) 位于:C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86
,所以我把这个路径添加到了系统环境变量中,你可以通过控制面板 > 系统 > 高级系统设置 > 环境变量来添加,或者在命令行 (cmd.exe) 中使用 pathman 命令。
希望这能帮到你,祝你编译顺利!
我在Windows 7专业版(64位)上能够重现所有这些错误。
你最后遇到的问题(工具链损坏)是由于一些与清单相关的问题引起的。我通过修改以下代码行(在msvc9compiler.py文件中)来解决这个问题:
mfinfo = self.manifest_get_embed_info(target_desc, ld_args)
改成
mfinfo = None
这样就绕过了紧接着的if语句。做了这个修改后,numpy成功编译了。