Windows 8.1、7 Enterprise和7 Home Edition下使用pip安装numpy时出现编译器问题。

21
我无法通过在运行Python 3.4的计算机上使用pip install numpy安装numpy,因为我收到了与编译问题相关的各种错误(这只适用于64位安装的Python)。
这是一个广泛报道的问题,我曾经有一个关于找不到vcvarsall.bat的相关问题。我在三台不同的干净机器上测试了这个问题,它们分别运行Windows 8.1、7企业版和7家庭版,但问题始终存在。
通过安装Visual Studio 2010 Express C++,可以消除链接中的第一个错误,即Unable to find 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的链接(该链接可帮助在Python3.4 32位安装中使用)
  • 按照一些用户的建议尝试使用easy_install进行安装

注意1:我知道可以使用此网站上的编译好的二进制文件来绕过问题,但我特别寻求使用distutils的解决方案。 注意2:错误日志很长,我为了易读性而截断了。


不要忘记以管理员身份运行cmd - Moganti Kesava
4个回答

9
我可以翻译所有这些错误在 Windows 7 Professional(64位)中都能重现。
你的最终问题(破损的工具链)是由更多的清单相关问题引起的。我能够通过更改以下行(在 msvc9compiler.py 中)来解决此问题:
mfinfo = self.manifest_get_embed_info(target_desc, ld_args)

to

mfinfo = None

因此,绕过了紧随其后的if语句。经过这个更改后,NumPy成功编译。

我已经尝试过这个方法,因为它是以上Peter Cock的链接中建议的,但对我没有起作用。您是否按照我的步骤操作?即打补丁msvc9compiler.py,然后插入KEY_BASE,接着更改mfinfo?我想也许我在其中一步中犯了错误。 - Matt
我按照你提供的链接中steve.dower描述的msvccompiler9_33.diff所做的更改。然后我在所有HKEYS设置之前添加了KEY_BASE(文件开头附近)。接着,我按照自己的说法更改了mfinfo行(很抱歉我没有看到Peter Cock的帖子链接),然后编译成功了。 - Wetnap
我不确定这是否相关,但你是否在使用Visual Studio 2010 Express? - Matt
不,我使用的是Visual Studio 2010专业版。在64位系统上可能存在2010 Express的问题。 - Wetnap
谢谢,我会检查一下并看看是否解决了问题。 - Matt
我可以确认这是Python 32位安装版本的清单问题,而不是64位版本。我不确定原因。我已经点赞了你的回答并编辑了问题 :)。 - Matt

8
尽管被采纳的答案可以工作,但它是对经受考验的库的不必要的猴子补丁。
要在其核心解决该问题:只需将(x86或 x64-取决于您的目标)Microsoft Manifest Tool(mt.exe)添加到您的路径中,并通过 pip 安装numpy。
自Visual Studio 2017以来,mt.exe 已移至Windows SDK 7.1/8.1/10,需要安装。
我的 mt.exe(x86)位于:C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86,这就是我已经添加到路径中的内容,可以通过控制面板 > 系统 > 高级系统设置 > 环境变量或使用控制台(cmd.exe)中的 pathman 命令来实现。
希望对您有所帮助,愉快编译!

你的意思是将它添加到路径中吗?只是在哪里运行Python和pip? - Jake Gaston
Jake Gaston,这是PATH环境变量:如何将工具位置添加到PATH环境变量 - chjortlund

2
如果你按照上述步骤仍未解决问题,请尝试以下简单的解决方案,它帮助我成功构建了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模块的问题,例如:error: Unable to find vcvarsall.batUnable to find vcvarsall.bat using Python 3.3 in Windows 8,有时似乎无法解决。

我的系统:Windows 7、Windows SDK 7.1、VS2010 Express with SP1、Python 3.4.3、64位。


1

我认为最简单的解决方案将是打开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,我必须使用这个命令提示符技巧。


使用这种方法来处理 cpython 3.5.1 amd64,numpy-1.10.4 和 c++ 2015 的预览版本,它可以正常工作。 - user3315862

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接