【问题标题】:Compiler problems with pip during numpy install under Windows 8.1, 7 Enterprise and 7 Home Editions在 Windows 8.1、7 Enterprise 和 7 Home Edition 下安装 numpy 期间 pip 的编译器问题
【发布时间】:2014-05-28 16:43:13
【问题描述】:

由于收到与编译问题相关的各种错误,我无法在运行 Python 3.4 的计算机上通过 pip install numpy 安装 numpy(这仅适用于 64 位安装的 Python)。

这是一个已被广泛报道的问题,我有 a related question 关于无法找到 vcvarsall.bat。我已经在运行 Windows 8.1、7 Enterprise 和 7 Home Editions 的三台不同的干净机器上对此进行了测试,并且它总是出现。

安装 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']

然后我关注了这个advice 并修补了论坛中链接的文件,导致 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 错误:

  • link 包含对 msvc9compiler.py 的进一步补丁
  • Peter Cock 的 link(这有助于 Python3.4 的 32 位安装)
  • 尝试使用 easy_install 安装,因为一些用户建议它可能会这样工作

注意 1:我知道在此 website 上使用已编译二进制文件的解决方法,如果有的话,我正在专门寻找使用 distutils 的解决方案。 注 2:错误日志明显更大,为了便于阅读,我将它们剪掉了。

【问题讨论】:

  • 别忘了以管理员身份运行cmd

标签: python windows numpy pip python-3.4


【解决方案1】:

我能够在 Windows 7 Professional(64 位)中重现所有这些错误。

您的最后一个问题(损坏的工具链)是由更多与清单相关的问题引起的。我可以通过更改以下行(在 msvc9compiler.py 中)来解决这个问题:

mfinfo = self.manifest_get_embed_info(target_desc, ld_args)

mfinfo = None

从而绕过了紧随其后的 if 语句。在此更改后,numpy 成功为我编译。

【讨论】:

  • 我已经尝试过了,正如上面 Peter Cock 的链接中所建议的那样,但它对我不起作用。你按照我的程序来了吗? IE。修补msvc9compiler.py,然后插入KEY_BASE,然后更改mfinfo?我在想,也许我在其中一个步骤中犯了错误。
  • 我在您提供的链接中进行了 steve.dower 在 msvccompiler9_33.diff 中描述的更改。然后我在所有 HKEYS 设置之前添加了 KEY_BASE(靠近文件的开头)。然后我按照我所说的更改了 mfinfo 行(对不起,我没有看到 Peter Cock 帖子的链接),它编译了。
  • 我不确定这是否相关,但您使用的是 Visual Studio 2010 Express 吗?
  • 不,我使用 Visual Studio 2010 Professional。 2010 Express 在 64 位系统上可能存在问题。
  • 谢谢,我会检查一下,看看是否能解决问题。
【解决方案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.bat ; Unable 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 bit

【讨论】:

    【解决方案3】:

    我认为最简单的解决方案是打开 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 的预览版,并且有效。
    【解决方案4】:

    虽然接受的答案是有效的,但对于经过实战测试的库来说,这是一个不必要的猴子补丁。

    要从根本上解决问题:只需将(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 这就是我添加到路径中的内容,通过控制面板 > 系统 > 高级系统设置 > 环境变量或使用 pathman 命令在控制台(cmd.exe)。

    希望对你有帮助,编译愉快!

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多