【问题标题】:error: Unable to find vcvarsall.bat错误:无法找到 vcvarsall.bat
【发布时间】:2025-12-30 10:40:16
【问题描述】:

我尝试安装Python包dulwich

pip install dulwich

但我收到一条神秘的错误消息:

error: Unable to find vcvarsall.bat

如果我尝试手动安装软件包,也会发生同样的情况:

> python setup.py install
running build_ext
building 'dulwich._objects' extension
error: Unable to find vcvarsall.bat

【问题讨论】:

  • 为了将来参考,看看你在什么平台上使用它会很高兴。
  • 如果您认为这是一条非常神秘且无用的错误消息,请在bugs.python.org/issue2943 为该错误投票
  • 微软现在提供解决方案:microsoft.com/en-us/download/details.aspx?id=44266
  • @MartijnPieters 我尝试下载并安装您使用 wheel 和 setuptools 7.0 提供的链接,但它不起作用我收到消息:C:\Users\User\libfreenect\wrappers\python>python setup.py installrunning install running build running build_ext building 'freenect' extension error: Unable to find vcvarsall.bat
  • Steve Dower(微软 Python 团队的一个人)写了一篇关于这个主题的博文,值得一读:blogs.msdn.microsoft.com/pythonengineering/2016/04/11/…

标签: python windows pip setup.py failed-installation


【解决方案1】:

更新:评论指出此处的说明可能很危险。考虑使用 Visual C++ 2008 Express 版本或专用的 Microsoft Visual C++ Compiler for Python (details) 和 NOT 使用下面的原始答案。原始错误消息表示未安装所需版本的 Visual C++。


对于 Windows 安装:

在运行 setup.py 进行软件包安装时,Python 2.7 会搜索已安装的 Visual Studio 2008。您可以通过在调用 setup.py 之前在 VS90COMNTOOLS 环境变量中设置正确路径来欺骗 Python 使用较新的 Visual Studio。

根据安装的 Visual Studio 版本执行以下命令:

  • Visual Studio 2010 (VS10):SET VS90COMNTOOLS=%VS100COMNTOOLS%
  • Visual Studio 2012 (VS11):SET VS90COMNTOOLS=%VS110COMNTOOLS%
  • Visual Studio 2013 (VS12):SET VS90COMNTOOLS=%VS120COMNTOOLS%
  • Visual Studio 2015 (VS14):SET VS90COMNTOOLS=%VS140COMNTOOLS%

警告:如下所述,如果您尝试编译 python 模块,则此答案不太可能起作用。

详情请见Building lxml for Python 2.7 on Windows

【讨论】:

  • @Gili:看起来这个问题是由于变量中的空格引起的,请尝试将其用引号括起来。对我来说 %VS100COMNTOOLS%="C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools"
  • 这对很多事情都不起作用,因为 Python 依赖于 VS2008。看看这个答案:*.com/questions/6551724/…
  • 警告!!!这是错误的答案。在任何情况下,您不应该使用不同的(版本)编译器编译 Python C 扩展,因为这两个(版本)编译器可能具有不兼容的 C 运行时库。有关详细信息,请参阅this 答案。
  • 您可以从go.microsoft.com/?linkid=7729279 下载免费的Visual C++ 2008 Express Edition,它将在安装过程中设置VS90COMNTOOLS 环境变量,从而使用兼容的编译器进行构建。
  • Python 3.3 和 3.4 用户注意:编译器现在是 VS2010。这意味着从 go.microsoft.com/?linkid=9709949 安装 Visual C++ 2010 Express 应该可以解决您的问题。
【解决方案2】:

我找到了解决方案。 我有完全相同的问题和错误,安装'amara'。我已经安装了 mingw32,但是需要配置 distutils。

  1. 我已经安装了 Python 2.6。
  2. 我将mingw32安装到C:\programs\mingw\
  3. 将 mingw32 的 bin 目录添加到您的环境变量中:将 c:\programs\MinGW\bin; 附加到 PATH
  4. 编辑(如果不存在则创建)distutils.cfg 位于C:\Python26\Lib\distutils\distutils.cfg 的文件为:

    [build]
    compiler=mingw32
    
  5. 现在运行easy_install.exe amara

通过打开一个新的cmd.exe 确保设置环境。

【讨论】:

  • 这适用于 Python2.6,但由于某种原因,我无法让它在 Python2.7 上运行。如果我下载我的包源并使用'python setup.py install --compile=mingw32'进行安装,它会起作用,但由于某种原因,使用easy_install或pip仍然试图找到vcvarsall。
  • 我终于在 Python(x,y) 2.7 中安装了 scikits.image,方法是将 C:\msysgit\mingw\mingw32\binC:\msysgit\mingw\bin 添加到用户 PATH 并在再次运行 pip install 之前重新启动 Spyder
  • 由于环境变量更改,永远都不需要重新启动。开一个新的cmd.exe进程就够了。
  • 我仍然无法解决这个问题。这是错误:gcc: error: unrecognized command line option '-mno-cygwin' error: Setup script exited with error: command 'gcc' failed with exit status 1easy_install.exe amara 之后
  • @user,您应该打开这个文件:C:\Python27\Lib\distutils\cygwincompiler.py 并从中删除所有出现的–mno-cygwin;这是因为最新版本的 GCC 已删除 –mno-cygwin 选项,它不应该存在。
【解决方案3】:

你可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/安装编译版

【讨论】:

  • 只是一个提示:您可以通过在 virtualenv 中运行 easy_install binary_installer_built_with_distutils.exe 来在 virtualenv 中安装这个站点的包,对应 this answer
  • 你也可以wheel convert ....exe这些安装程序,然后随时用pip安装它们。
  • 更准确地说,lfd.uci.edu/~gohlke/pythonlibs/#mysql-python 下载后以管理员身份打开终端并运行 python -m pip install <filename>
  • 圣母,这就是现场。工作就像一个魅力,TY :)
【解决方案4】:

如果你想用 Visual Studio C++ 编译而不是 mingw...

  1. 运行python.exe 以显示编译时使用的VC++ 版本(示例如下)。

    重要使用编译 Python 时使用的 Visual C++ 编译器的相应版本,因为distilutilsget_build_version 防止混合版本 (per Piotr's warning)。

    • 黄色(顶部)是 Python 2.7,使用 MSC v.1500 (Visual Studio C++ 2008) 编译
    • 红色(底部)是 Python 3.4.1,使用 MSC v.1600 (Visual Studio C++ 2010) 编译

  2. 使用下表[1] 将内部 VC++ 版本与相应的 Visual Studio 版本相匹配:

    MSC v.1000 -> Visual C++ 4.x        
    MSC v.1100 -> Visual C++ 5          
    MSC v.1200 -> Visual C++ 6          
    MSC v.1300 -> Visual C++ .NET       
    MSC v.1310 -> Visual C++ .NET 2003  
    MSC v.1400 -> Visual C++ 2005  (8.0)
    MSC v.1500 -> Visual C++ 2008  (9.0)
    MSC v.1600 -> Visual C++ 2010 (10.0)
    MSC v.1700 -> Visual C++ 2012 (11.0)
    MSC v.1800 -> Visual C++ 2013 (12.0)
    MSC v.1900 -> Visual C++ 2015 (14.0)
    MSC v.1910 -> Visual C++ 2017 (15.0)
    MSC v.1911 -> Visual C++ 2017 (15.3)
    MSC v.1912 -> Visual C++ 2017 (15.5)
    MSC v.1913 -> Visual C++ 2017 (15.6)
    MSC v.1914 -> Visual C++ 2017 (15.7)
    MSC v.1915 -> Visual C++ 2017 (15.8)
    MSC v.1916 -> Visual C++ 2017 (15.9)   
    
  3. 从上一步下载并安装相应版本的 Visual Studio C++。
    下面列出了特定版本的 VC++ 的附加说明。

    Visual Studio C++ 2008 的注意事项

    仅限 32 位编译器,下载Visual Studio C++ 2008 Express Edition

    对于 64 位编译器[2][3],下载Windows SDK for Windows 7 and .NET Framework 3.5 SP1

    • 取消选中除Developer Tools >> Visual C++ Compilers 之外的所有内容,以节省安装您不需要的SDK 工具的时间和磁盘空间。

    Visual Studio C++ 2010 的注意事项

    根据微软的说法,如果您安装了 Visual Studio 2010 SP1,它可能已经删除了 VC++ 的编译器和库。
    如果是这种情况,请下载Visual C++ 2010 SP1 Compiler Update

    Visual Studio C++ 2015 的注意事项

    如果您不需要 Visual Studio IDE,请下载 Visual Studio C++ 2015 Build Tools

    Visual Studio C++ 2017 的注意事项

    如果您不需要 Visual Studio IDE,请下载 Build Tools for Visual Studio 2017

    建议:如果您同时安装了 32 位和 64 位 Python,您可能还想使用 virtualenv 创建单独的 Python 环境,以便您可以同时使用其中一个或另一个时间不会弄乱您选择使用哪个 Python 版本的路径。

根据@srodriguex,您可以跳过手动加载批处理文件(步骤 4-6),而是按照this answer 将一些批处理文件复制到 Python 正在搜索的位置。如果这不起作用,以下是最初对我有用的步骤。

  1. 打开cmd.exe

  2. 您尝试安装需要 C 扩展的东西之前,运行以下批处理文件以将 VC++ 编译器的环境加载到会话中(即环境变量、编译器的路径等)。

    执行:

    • 32 位编译器:

      注意:32 位 Windows 安装将只有 C:\Program Files\ 符合预期

      "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"

    • 64 位编译器:

      "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars64.bat"

      注意:是的,原生 64 位编译器位于 Program Files (x86) 中。不要问我为什么。
      另外,如果您想知道vcvars64.batvcvarsx86_amd64.bat 之间的区别,或者更重要的是amd64x86_amd64 之间的区别,则前者适用于本机64 位编译器工具,后者适用于64 位可以在 32 位 Windows 安装上运行的交叉编译器。

    更新:
    如果由于某种原因你得到error: ... was unexpected at this time. 其中... 是一些字符系列,那么你需要检查你的路径变量没有任何多余的字符,如额外的引号或杂散字符。如果批处理文件一开始就无法理解它,它将无法更新您的会话路径。

  3. 如果一切顺利,您应该会收到以下消息之一,具体取决于您运行的 VC++ 版本和命令:

    对于 32 位编译器工具:
    Setting environment for using Microsoft Visual Studio 20xx x86 tools.

    对于 64 位编译器工具:
    Setting environment for using Microsoft Visual Studio 20xx x64 tools.

  4. 现在,通过python setup.py installpip install pkg-name 运行设置

  5. 希望行星正确对齐,以便 VC++ 进行合作。

【讨论】:

  • 不能推荐足够的东西让你经历直接迁移到 64 位的痛苦。您需要超过 4GB 的地址空间只是时间问题。我是从 32 位之后的痛苦经历中说出来的,因为它要容易得多,然后必须卸载所有内容,包括依赖项和 64 位。几乎整个周末。
  • 再一次,我忘记了有多少人将不得不使用 Python 来完成这样的更大任务。还有@ThomasBrowne,我敢肯定这是一种痛苦且不必要的邪恶体验。我正在研究它,希望我能找到一些东西。主要问题是 Visual Studio C++ 2008 Express 没有附带 64 位编译器,但我确定它就在某个地方。
  • 刚刚更新了它,提供了更多信息,包括如何在需要时获取 64 位编译器。
  • 在我的情况下,我按照上面的步骤 1 并跳过了 this answer 之后的其余部分。现在我可以安装软件包,避免运行 .bat 的烦恼。
  • @srodriguex 在这种情况下很好,看起来 Python 假设 64 位编译器工具使用它正在寻找 ...\VC\bin\vcvarsamd64.bat...\VC\bin\amd64\vcvarsamd64.bat 被加载到 PATH 中。
【解决方案5】:

发生了什么事? Python 模块可以是part written in C or C++(通常是为了速度)。如果您尝试使用 Pip(或setup.py)安装这样的包,它必须从源代码编译该 C/C++。开箱即用,Pip 会厚颜无耻地假设您安装了编译器 Microsoft Visual C++。如果您没有它,您将看到这条神秘的错误消息“错误:无法找到 vcvarsall.bat”。

规定的解决方案是安装 C/C++ 编译器,Microsoft Visual C++ 或 MinGW(一个开源项目)。但是,安装和配置其中任何一个都非常困难。 (2014 年编辑:微软为 Python 2.7 发布了一个特殊的 C++ compiler

最简单的解决方案是使用 Christoph Gohlke 的 Windows 安装程序 (.msi) 来安装流行的 Python 包。他为 Python 2.x 和 3.x、32 位和 64 位构建安装程序。您可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/下载它们


如果您也认为“错误:无法找到 vcvarsall.bat”是一个荒谬的神秘且无用的消息,请在 http://bugs.python.org/issue2943 上评论该错误,以将其替换为更有用且用户友好的消息。

作为比较,Ruby 附带了一个包管理器 Gem,并提供了一个准官方的 C/C++ 编译器 DevKit。如果您尝试在没有它的情况下安装软件包,您会看到这条有用的友好有用的消息:

请更新您的 PATH 以包含构建工具或从 http://rubyinstaller.org/downloads 下载 DevKit,并按照 http://github.com/oneclick/rubyinstaller/wiki/Development-Kit 的说明进行操作

您可以在https://*.com/a/13445719/284795 阅读有关 Python 打包的更长篇幅

【讨论】:

  • 如何使用 pip 在我的虚拟环境中安装这个预编译的可执行文件?
  • @shailenTJ 好问题。我从来没有做过,但试试*.com/a/5442340/284795
  • 这是我所知道的最好/最简单的解决方案。谢谢。
  • Edit 2014 对我来说是最好的答案。容易错过的说明:确保您使用pip install setuptools --upgradesetuptools 更新到6.0 或更高版本。
【解决方案6】:

您需要安装与用于构建 Python 的编译器兼容的 Microsoft 编译器。这意味着您需要 Visual C++ 2008(或更新版本,some tweaking)。

Microsoft 现在提供了一个捆绑的编译器和头文件只是,以便能够在令人难忘的 URL 处编译 Python 扩展:

适用于 Python 2.7 的 Microsoft Visual C++ 编译器

http://aka.ms/vcpython27

这是一个相对较小的包; 85MB 可下载,无需管理员权限即可安装,无需重启。这个名字有点误导,编译器将适用于最初使用 Visual C++ 2008 编译的任何 Python 版本,而不仅仅是 Python 2.7。

如果您启动 Python 交互式提示或打印 sys.version,则查找 MSC 版本字符串;如果是MSC v.1500,可以使用这个工具。

来自original announcement to the distutils list

Microsoft 发布了 Python 2.7 的编译器包,使人们更容易在 Windows 上构建和分发他们的 C 扩展模块。适用于 Python 2.7(又名 VC9)的 Microsoft Visual C++ 编译器可从以下网址获得:http://aka.ms/vcpython27

此软件包包含为 Python 2.7 32 位和 64 位构建 C 扩展模块所需的所有工具和头文件(请注意,某些扩展模块需要未包含的第三方依赖项,例如 OpenSSL 或 libxml2)。还支持使用 Visual C++ 2008 构建的其他 Python 版本,因此“Python 2.7”只是广告——它可以与 2.6 和 3.2 一起正常工作。

请注意,您需要安装setuptools 6.0 or newer(在下载页面的系统要求中列出)。您正在安装的项目必须使用setuptools.setup(),而不是distutils,否则自动检测将不起作用。

Microsoft 已表示他们希望保持 URL 稳定,以便自动化脚本可以轻松引用它。

【讨论】:

  • 根据我的其他评论,您可以确保setuptoolspip install setuptools --upgrade 是最新的。
  • 我研究了为什么相关逻辑在setuptools而不是distutils - 毕竟,构建模块是核心功能,它确实有相关代码,但是旧版本的它。看起来distutils 的维护人员刚刚放弃了支持所有可能的 MSSDK 变体,并将这项工作转交给了更热切的 setuptools 同事。
  • @ivan_pozdeev:setuptools 也可以比distutils 更频繁地发布,包括在 Python 发布周期中。而distitutils 确实已经进入了某种维护模式,正在开发新系统以取代它。相反,这项工作停滞不前。
  • cython 使用 distutils,你需要导入 setuptools 猴子补丁 distutils:github.com/cython/cython/wiki/CythonExtensionsOnWindows
【解决方案7】:

我也遇到了同样的问题,所以我会在这里讲述我的故事,希望它可以帮助遇到同样问题的其他人,并节省我刚刚花费的几个小时:

我在 windows 7 机器中有 mingw (g++ (GCC) 4.6.1) 和 python 2.7.3,我正在尝试安装 PyCrypto。

运行 setup.py install 时出现此错误:

error: Unable to find vcvarsall.bat

通过将 mingw 指定为选择的编译器在谷歌上搜索错误后很容易解决:

setup.py install build --compiler=mingw32

问题是我得到了一个不同的错误:

configure: error: cannot run C compiled programs.

事实证明,我的防病毒软件阻止了新编译的 .exe 的执行。我刚刚禁用了杀毒“驻留盾”,进入下一个错误:

cc1.exe: error: unrecognized command line option '-mno-cygwin' 
error: command 'gcc' failed with exit status 1

这解决了它:“要么安装稍旧版本的 MinGW,要么编辑 Python 目录中的 distutils\cygwinccompiler.py 以删除 -mno-cygwin 的所有实例。” (来自here

现在,我终于可以开始工作了。

【讨论】:

【解决方案8】:

看起来它正在寻找 VC 编译器,所以你可以尝试使用 -c mingw32 提及编译器类型,因为你有 msys

python setup.py install -c mingw32

【讨论】:

  • 只是为了澄清,有效的命令是:python setup.py build --compiler=mingw32,后跟python setup.py install
  • 运行 python setup.py build --compiler=mingw32 后,我收到 ImportError: No module named Cython.Distutils 而 Cython 安装在 Anaconda 下。有什么建议吗?
【解决方案9】:

我有 python 2.73 和 windows 7。对我有用的解决方案是:

  1. 将 mingw32 的 bin 目录添加到环境变量:将 PATH 附加到 C:\programs\mingw\bin;
  2. 创建的 distutils.cfg 位于 C:\Python27\Lib\distutils\distutils.cfg,包含:

    [build]
    compiler=mingw32
    

为了处理 MinGW 不再识别 -mno-cygwin 标志,删除 C:\Python27\Lib\distutils\cygwincompiler.py 第 322 到 326 行中的标志,如下所示:

  self.set_executables(compiler='gcc -O -Wall',
                         compiler_so='gcc -mdll -O -Wall',
                         compiler_cxx='g++ -O -Wall',
                         linker_exe='gcc',
                         linker_so='%s %s %s'
                                    % (self.linker_dll, shared_option,
                                       entry_point))

【讨论】:

    【解决方案10】:

    查看您尝试安装的软件包的setup.py 文件。如果它是一个较旧的包,它可能正在导入 distutils.core.setup() 而不是 setuptools.setup()

    我在 2015 年遇到了这个问题,结合了以下因素:

    1. 来自http://aka.ms/vcpython27 的适用于 Python 2.7 的 Microsoft Visual C++ 编译器

    2. 使用distutils.core.setup()的旧包

    3. 尝试使用python setup.py build 而不是使用pip

    如果您使用最新版本的 pip,它将强制 (monkeypatch) 软件包使用 setuptools,即使它的 setup.py 调用 distutils。但是,如果您不使用 pip,而只是在执行 python setup.py build,则构建过程将使用 distutils.core.setup(),它不知道编译器安装位置。


    解决方案

    第 1 步:打开相应的 Visual C++ 2008 命令提示符

    打开开始菜单或开始屏幕,搜索“Visual C++ 2008 32-bit Command Prompt”(如果您的 python 是 32 位)或“Visual C++ 2008 64-bit Command Prompt”(如果您的 python 是 64 -少量)。运行。命令提示符应在标题栏中显示 Visual C++ 2008 ...。

    第二步:设置环境变量

    在刚刚打开的命令提示符中设置这些环境变量。

    SET DISTUTILS_USE_SDK=1
    SET MSSdk=1
    

    参考http://bugs.python.org/issue23246

    第 3 步:构建和安装

    cd 到你要构建的包,然后运行python setup.py build,然后运行python setup.py install。如果要安装到 virtualenv,请在构建之前激活它。

    【讨论】:

    • 你也可以使用 pip 而不是 python setup.py build 来构建你的包
    【解决方案11】:

    也许有人会感兴趣,以下为我工作的 py2exe 包。 (我有 windows 7 64 位和可移植的 python 2.7、Visual Studio 2005 Express 以及适用于 Windows 7 和 .NET Framework 4 的 Windows SDK)

    set VS90COMNTOOLS=%VS80COMNTOOLS%
    

    然后:

    python.exe setup.py install
    

    【讨论】:

    • 不,你说得对,我不知道发生了什么,我会删除原来的评论。
    • 非常有用!!就我而言,我设置了 'set VS90COMNTOOLS=%VS110COMNTOOLS%'。
    • @Exzile: 是的,你在同一个命令提示符会话中输入这些命令
    • 不要这样做!!!请参阅this answer了解更多详情。
    【解决方案12】:

    我花了将近 2 天的时间来弄清楚如何在我的 python 3.4 64 位版本中解决这个问题:Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64位(AMD64)]在win32上

    解决方案 1,困难:(在阅读本文之前,请先阅读下面的解决方案 2) 最后,这对我有帮助:

    1. 安装Visual C++ 2010 Express
    2. 安装Microsoft Windows SDK v7.1 for Windows 7
    3. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 中手动创建文件 vcvars64.bat,其中包含 CALL "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 或其他路径,具体取决于您的安装位置
    4. (这似乎是可选的)安装Microsoft Visual Studio 2010 Service Pack 1Microsoft Visual C++ 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1
    5. 之后我尝试pip install numpy但收到以下错误:

      File "numpy\core\setup.py", line 686, in get_mathlib_info
      raise RuntimeError("Broken toolchain: cannot link a simple C program")
      RuntimeError: Broken toolchain: cannot link a simple C program
      

      我将C:\Python34\Lib\distutils\msvc9compiler.py 中的mfinfo 更改为None,根据这个https://*.com/a/23099820/4383472

    6. 最后在pip install numpy 命令之后,我的avast 杀毒软件试图干扰安装过程,但我很快将其禁用

    花了很长时间-numpy编译好几分钟,我什至认为有错误,但最终一切正常。

    解决方案 2,简单: (我知道这种方法已经在高度投票的answer 中提到过,但让我重复一遍,因为它确实更容易) 在完成所有这些工作后,我明白对我来说最好的方法就是在将来使用来自http://www.lfd.uci.edu/~gohlke/pythonlibs/ 的已经预编译的二进制文件。我需要一些本网站不包含的包(或包的版本)的可能性很小。这种方式的安装过程也快得多。比如安装numpy

    1. 从该站点下载 numpy‑1.9.2+mkl‑cp34‑none‑win_amd64.whl(如果您有 Python 3.4 64 位)
    2. 在命令提示符或 powershell 中使用 pip pip install numpy‑1.9.2+mkl‑cp34‑none‑win_amd64.whl 安装它(或文件的完整路径,具体取决于命令提示符的打开方式)

    【讨论】:

    • numpy‑1.9.2+mkl‑cp34‑none‑win_amd64.whl - 在上述链接中找不到此文件。
    【解决方案13】:

    我想在 Python 2.7 下的 Windows 10 上运行 pysph,但找不到 vcvarsall.bat(来自 distutils)

    我的解决方案如下:

    为 Python 2.7 安装 Microsoft Visual C++(如 @Michael 建议的那样)

    在 Windows 10 上,它被安装到(我的用户名是 Andreas):

    C:\Users\Andreas\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0
    

    将环境变量VS90COMNTOOLS设置为Visual C++ for Python 2.7的安装路径(路径见上)。

    如果还是不行,那就在模块中修改

    C:/Python27/lib/distutils
    

    文件 msvc9compiler.py。在其中找到函数find_vcvarsall并进行如下修改。

    换行:

    productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")
    

    productdir = os.path.join(toolsdir)
    

    这是 vcvarsall.bat 在我的案例中所在的位置(检查 vcvarsall.bat 在您的安装中的位置)。

    【讨论】:

    • 有趣的是%userprofile%\Appdata\Local\Programs\Common 对我来说是空的。
    • 即使在安装 Microsoft Visual C++ for Python 2.7 之后?
    【解决方案14】:

    当我尝试在我的 python 3.5 上安装 numpy 库时遇到了这个问题。解决办法是安装VS2015。我有VS2008、2012、2013,它们都不兼容python 3.5。显然较新版本的 python 依赖于较新版本的 VS。

    还要确保 C++ 通用工具与 Visual Studio 一起安装。

    【讨论】:

      【解决方案15】:

      我尝试了以上所有答案,发现所有答案都不起作用,这可能是我使用的是 Windows 8 并安装了 Visual Studio 2012。在这种情况下,这就是你所做的。

      vcvarsall.bat 文件位于此处: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC

      只需选择文件,然后复制它。

      然后进入这个目录: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools

      并粘贴文件。然后,一切都会好起来的。

      【讨论】:

      • 不,一切都不是很好我按照你的回答,但我仍然得到同样的错误。
      【解决方案16】:

      您可以从http://go.microsoft.com/?linkid=7729279 下载免费的 Visual C++ 2008 Express Edition,它将在安装过程中设置 VS90COMNTOOLS 环境变量,从而使用兼容的编译器进行构建。

      正如@PiotrDobrogost 在评论中提到的那样,他对其他问题的回答详细说明了为什么 Visual C++ 2008 是正确的构建工具,但是随着 Python 的 Windows 构建迁移到新版本的 Visual Studio,这种情况可能会发生变化:Building lxml for Python 2.7 on Windows

      【讨论】:

      • 还要确保没有安装其他版本。我很难受。我重新格式化了电脑,只安装了这个版本。因为删除多个版本的 VS 会花费我同样的时间。
      【解决方案17】:

      我在 Windows 7 x64 上使用 Python 3.4.1 时遇到了这个问题,不幸的是,我需要的软件包没有合适的 exe 或*可供我使用。该系统需要一些“变通办法”,详情如下(TLDR 位于底部)。

      使用Jaxrtech's answer above 中的信息,我确定我需要 Visual Studio C++ 2010(sys.version 返回 MSC v.1600),所以我从他的答案中的链接(http://go.microsoft.com/?linkid=9709949)安装了 Visual C++ 2010 Express。我安装了所有带有更新的东西,但正如您在下面看到的,这是一个错误。此时应该只安装 Express 的原始版本(没有更新任何东西)。

      vcvarsall.bat 现在存在,但安装包时出现了一个新错误,query_vcvarsall raise ValueError(str(list(result.keys())))ValueError: [u'path']。这个错误还有其他*问题,比如Errors while building/installing C module for Python 2.7

      我从该答案确定 2010 Express 仅安装 32 位编译器。要获得 64 位(和其他)编译器,您需要安装 Windows 7.1 SDK。见http://msdn.microsoft.com/en-us/windowsserver/bb980924.aspx

      但这不会为我安装,安装程序返回错误installation failed with return code 5100。我在以下链接中找到了解决方案:http://support.microsoft.com/kb/2717426。简而言之,如果安装了较新版本的 x86 和 x64 Microsoft Visual C++ 2010 Redistributable,它们会与 SDK 安装程序中的冲突,需要先卸载。

      然后安装了 SDK,但我注意到 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin 及其子文件夹中仍然不存在 vcvars64.bat。 vcvarsall.bat 运行 vcvars64 批处理文件,所以没有它,python 包仍然无法安装(我忘记了此时显示的错误)。

      然后我在这里找到了一些说明:http://www.cryptohaze.com/wiki/index.php/Windows_7_Build_Setup#Download_VS_2010_and_Windows_SDK_7.1 按照说明,我已经安装了 Express 和 7.1 SDK,因此安装了 SDK 7.1 SP1,并修复了丢失的头文件。然后我手动创建了内容为CALL setenv /x64 的vcvars64.bat。我会将所有这些说明粘贴在这里,以免它们丢失。

      第 1 步是下载 Visual Studio Express 2010。

      http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express 是一个很好的起点。下载安装程序,然后运行 (vc_web.exe)。您不需要额外下载 SQL 2008。

      您还需要用于 64 位的 Windows SDK(当前为 7.1) 编译器 - 除非您只想进行 32 位构建,否则 完全支持...

      http://www.microsoft.com/en-us/download/details.aspx?id=8279 不错 下载这个的起点 - 你需要运行 winsdk_web.exe 下载时!

      这里默认安装就好了。

      最后,下载并安装 Windows SDK 7.1 SP1 更新: http://www.microsoft.com/en-us/download/details.aspx?id=4422

      并且,为了修复丢失的头文件,VS2010 SP1。 http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5

      而且,该死的,修复 VS2010 Express 丢失的批处理文件。这 越来越荒谬了。

      在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 中, 使用以下内容创建“vcvars64.bat”(您需要运行 作为管理员):

      调用 setenv /x64

      我的 python 包仍然没有安装(不记得错误)。然后我找到了一些使用特殊 SDK 7.1 命令提示符的说明(复制如下),请参阅:https://mail.python.org/pipermail/distutils-sig/2012-February/018300.html

      别在意这个问题。这里有人注意到菜单上的这个项目:开始->所有程序->Microsoft Windows SDK v7.1 ->Windows SDK 7.1 命令提示符

      这会运行一个批处理作业,似乎为编译器设置了一个工作环境。在该提示下,您可以键入“setup.py build”或“setup.py install”。

      我按照说明打开了 Windows SDK 7.1 命令提示符,并使用它在 python 包上运行 easy_install。最后,成功!


      TLDR;

      1. 安装 Visual Studio Express 2010(最好不要更新可再发行组件或 SQL 服务器)。
      2. 安装 Windows 7.1 SDK
      3. 安装 SDK 7.1 SP1 更新和 VS2010 SP1 头文件修复(此步骤可能不需要)。
      4. 手动创建C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvars64.bat,内容为CALL setenv /x64
      5. 开始->所有程序->Microsoft Windows SDK v7.1 ->Windows SDK 7.1 命令提示符打开特殊的 x64 命令提示符,然后可以与 python/easy_install/pip/etc 一起使用(包括 virtual_envs 中的那些)。

      【讨论】:

        【解决方案18】:

        使用此链接下载并安装Visual C++ 2015 Build Tools。它将自动下载visualcppbuildtools_full.exe 并安装Visual C++ 14.0,而无需实际安装Visual Studio。安装完成后重试 pip install 就不会再报错了。

        我已经在以下平台和版本上测试过:

        Python 3.6 on Windows 7 64-bit
        Python 3.7 on Windows Server 2016 (64-bit system)
        Python 3.8 on Windows 10 64-bit
        

        【讨论】:

        • 我是安装所有东西还是需要自定义安装?
        • @Idonknow 无需安装完整的 Visual Studio,您只需从上面提供的链接下载并安装 Visual C++。
        【解决方案19】:

        以下步骤为我解决了这个问题,我正在尝试使用 cython 扩展创建设置。

        1. 安装 Microsoft Visual C++ Compiler for Python 2.7
        2. 默认安装位置是@ C:\Users\PC-user\AppData\Local\Programs\Common\Microsoft\Visual C++ 对于 Python 这实际上可能会解决问题,在继续之前测试一次。
        3. 如果失败,请检查 VC++ 中的位置 对于 python vcvarsall.bat 文件位于
        4. 打开 msvc9compiler.py 记事本中的 distutils 包文件。
        5. 在我的盒子里这是@ C:\Anaconda2\Lib\distutils\msvc9compiler.py find_vcvarsall 函数 在这个文件中,通过打印出版本来确定VC的版本 争论。对于 Python 2.7,它可能是 9.0
        6. 现在创建一个 环境变量 VS90COMNTOOLS,指向 C:\Users\PC-user\AppData\Local\Programs\Common\Microsoft\Visual C++ 对于 Python\9.0\VC\bin
        7. 出于某种原因, distutils 期望 vcvarsall.bat 文件位于 VC 目录中,但 VC++ 用于 python 工具 有它在 9.0 的根目录中要解决此问题,请从 path.join(大约在第 247 行附近)

          #productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC") productdir = os.path.join(toolsdir, os.pardir, os.pardir)

        以上步骤为我解决了这个问题。

        【讨论】:

        • 按照上述步骤 LINK 出现链接错误:错误 LNK2001:无法解析的外部符号 init__init__ build\temp.win-amd64-2.7\Release_init_.lib:致命error LNK1120: 1 unresolved externals error: command 'C:\\Users\\ma306477\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\ amd64\\link.exe' 失败,退出状态为 1120
        【解决方案20】:

        调用import setuptools 将修改 distutils 以强制与 Visual Studio 兼容。手动调用vcvars32.bat 将设置虚拟环境并防止编译器抛出的其他常见错误。对于 VS 2017,该文件位于

        "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"

        这是我用来快速将 .pyx 文件编译为 .pyd 的设置脚本: (注意:它使用 3rd 方模块 send2trash

        # cython_setup.py
        import sys, os, time, platform, subprocess
        from setuptools import setup, find_packages
        from Cython.Build import cythonize
        from traceback import format_exc
        
        # USAGE:
        #
        #   from cython_setup import run
        #   run(pyx_path)
        
        # vcvars = r"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
        
        # NOTE: to use visual studio 2017 you must have setuptools version 34+
        vcvars = r"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars32.bat"
        
        
        def _build_ext():
            try:
                pyx_path = sys.argv.pop(-1)
                pyx_path = os.path.abspath(pyx_path)
                if not os.path.exists(pyx_path):
                    raise FileNotFoundError(f"{pyx_path} does not exist")
                project_name = sys.argv.pop(-1)
                os.chdir(os.path.abspath(os.path.dirname(pyx_path)))
        
                print("cwd: %s" % os.getcwd())
                print(os.path.abspath("build"))
                setup(
                    name=project_name,
                    # cmdclass = {'build_ext': build_ext},
                    packages=find_packages(),
                    # ext_modules=cythonize(extensions)
                    ext_modules=cythonize(pyx_path,
                                          compiler_directives={'language_level': 3, 'infer_types': True, 'binding': False},
                                          annotate=True),
                    # include_dirs = [numpy.get_include()]
                    build_dir=os.path.abspath("build")
                )
            except:
                input(format_exc())
        
        
        def retry(func):
            def wrapper(*args, **kw):
                tries = 0
                while True:
                    try:
                        return func(*args, **kw)
                    except Exception:
                        tries += 1
                        if tries > 4:
                            raise
                        time.sleep(0.4)
        
            return wrapper
        
        
        @retry
        def cleanup(pyx_path):
            from send2trash import send2trash
            c_file = os.path.splitext(pyx_path)[0] + ".c"
            if os.path.exists(c_file):
                os.remove(c_file)
        
            if os.path.exists("build"):
                send2trash("build")
        
        
        def move_pyd_files(pyx_path):
            pyx_dir = os.path.dirname(pyx_path)
            build_dir = os.path.join(pyx_dir, "build")
            if not os.path.exists(build_dir):
                raise RuntimeError(f"build_dir {build_dir} did not exist....")
            found_pyd = False
            for top, dirs, nondirs in os.walk(build_dir):
                for name in nondirs:
                    if name.lower().endswith(".pyd") or name.lower().endswith(".so"):
                        found_pyd = True
                        old_path = os.path.join(top, name)
                        new_path = os.path.join(pyx_dir, name)
                        if os.path.exists(new_path):
                            print(f"removing {new_path}")
                            os.remove(new_path)
                        print(f"file created at {new_path}")
                        os.rename(old_path, new_path)
            if not found_pyd:
                raise RuntimeError("Never found .pyd file to move")
        
        def run(pyx_path):
            """
            :param pyx_path:
            :type pyx_path:
            :return: this function creates the batch file, which in turn calls this module, which calls cythonize, once done
            the batch script deletes itself... I'm sure theres a less convoluted way of doing this, but it works
            :rtype:
            """
            try:
                project_name = os.path.splitext(os.path.basename(pyx_path))[0]
                run_script(project_name, os.path.abspath(pyx_path))
            except:
                input(format_exc())
        
        
        def run_script(project_name, pyx_path):
            dirname = os.path.dirname(pyx_path)
            # ------------------------------
            os.chdir(dirname)
            if os.path.exists(vcvars):
                #  raise RuntimeError(
                # f"Could not find vcvars32.bat at {vcvars}\nis Visual Studio Installed?\nIs setuptools version > 34?")
                subprocess.check_call(f'call "{vcvars}"', shell=True)
        
            cmd = "python" if platform.system() == "Windows" else "python3"
            subprocess.check_call(f'{cmd} "{__file__}" build_ext "{project_name}" "{pyx_path}"', shell=True)
            move_pyd_files(pyx_path)
            cleanup(pyx_path)
        
        
        if len(sys.argv) > 2:
            _build_ext()
        

        【讨论】:

        • 确实,导入setuptools 会有所帮助,cython compilation 也是如此。
        • 你能详细解释一下吗?如何手动调用 vcvars32.bat?我有 cython 编译
        • 在安装 Visual C++ 构建工具后,运行 pip install --upgrade setuptools 对我有用。
        【解决方案21】:

        我尝试了很多解决方案,但只有一个对我有用,即安装 Microsoft Visual Studio 2008 Express C++。

        我在使用 C 语言编写的 Python 2.7 模块时遇到了这个问题(yEnc,它与 MS VS 有其他问题)。请注意,Python 2.7 是使用 MS VS 2008 版本构建的,而不是 2010!

        尽管它是免费的,但由于 MS 正在推广 VS 2010,所以很难找到它。 尽管如此,MSDN 官方非常直接的链接仍然有效:请查看https://*.com/a/15319069/2227298 以获取下载链接。

        【讨论】:

        • 是的,最好的方法是安装VS2008。
        【解决方案22】:

        如果你安装了mingw

        pip install --global-option build_ext --global-option --compiler=mingw32 packagename
        

        有效,强制 pip 使用 mingw 编译器而不是 Microsoft 编译器进行构建。详情请见https://github.com/pypa/pip/issues/18(最后一篇文章)。

        【讨论】:

          【解决方案23】:

          http://www.microsoft.com/en-us/download/details.aspx?id=44266 的 Microsoft Visual C++ Compiler for Python 2.7 不是解决方案吗?

          【讨论】:

          • 为我工作。 pip install pysftp 末尾的错误消息有这个解决方案error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
          【解决方案24】:

          在 2016 年解决此问题的最简单方法是安装 Chocolatey,然后安装 vcpython27 包。打开 Powershell:

          > iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
          > choco install python2 -y
          > choco install vcpython27 -y
          

          【讨论】:

            【解决方案25】:

            我不知道是不是太晚了,但我找到了Microsoft Visual C++ Compiler for Python 2.7,上面写着

            如果您需要此编译器包,您将收到的典型错误消息是无法找到 vcvarsall.bat

            希望这会有所帮助!

            【讨论】:

              【解决方案26】:

              MS VС++ 版本的详尽列表和安装变体distutils(还有一些由setuptools)官方支持以及如何使用它们可以在

              找到

              https://wiki.python.org/moin/WindowsCompilers

              它还指定哪个官方 Win32 Python 版本需要哪个 VC++ 版本。 请注意,MinGW 不受官方支持(详见下文)。

              简而言之:

              • 对于每个版本,都有一个开箱即用的特定 Visual Studio 版本。
              • 对于独立 SDK,通常需要从 SDK 提示符运行安装(=设置环境变量)。
                • 对于某些人来说,这一要求可以通过没有不利副作用的一次性调整来解除
              • setuptools 支持一些不寻常的 VC++ 版本,而不是distutils
              • MinGW 据说可以“工作”,但仅适用于 x86。 https://bugs.python.org/issue4709 表示其支持的问题在于 MinGW 本身,即使 x86 也一定会有自 Python 3.5 以来的问题。

              【讨论】:

                【解决方案27】:

                我遇到了同样的问题,目前已经解决了。

                “Google”告诉我需要安装“Microsoft Visual C++ Compiler for Python 2.7”。我不仅安装了该工具,还安装了 Visual C++ 2008 Reditributable,但它没有帮助。然后我尝试安装 Visual C++ 2008 Express Edition。问题就解决了!

                只需尝试安装 Visual C++ 2008 Express Edition!

                【讨论】:

                  【解决方案28】:

                  如果您希望在没有安装 Visual Studio 的 Windows 机器上安装 pyodbc,另一种选择是使用二进制分发版手动安装 pyodbc。

                  如果您在正在使用的机器上没有管理员权限并尝试设置virtualenv,这将特别有用。

                  步骤:

                  1. here (pyodbc-X.X.X.win-Y-py2.7.exe) 下载最新的 Windows 安装程序
                  2. 使用 7-Zip(或 WinRAR 或其他)打开安装程序可执行文件
                  3. 提取 pyodbc.pyd 和 pyodbc-X.X.X-py2.7.egg-info 并将它们放在[python installation directory or virtualenv]\Lib\site-packages
                  4. 没有第 4 步 :)

                  【讨论】:

                    【解决方案29】:

                    使用 Python 3.4,依赖于 Visual Studio 2010。安装 Visual C++ 2010 Express 为我解决了这个问题。

                    欺骗它使用我碰巧没有工作的 VS 2008 或 2013 安装。

                    【讨论】:

                      【解决方案30】:

                      您可以使用 easy_install 而不是 pip 它对我有用。

                      【讨论】:

                      • 同样的错误error: Setup script exited with error: Unable to find vcvarsall.bat
                      最近更新 更多