ChatGPT解决这个技术问题 Extra ChatGPT

错误:无法找到 vcvarsall.bat

我尝试安装 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 现在提供了一个解决方案:microsoft.com/en-us/download/details.aspx?id=44266
@MartijnPieters 我尝试下载并安装您使用 wheel 和 setuptools 7.0 提供的链接,但它不起作用我收到消息:C:\Users\User\libfreenect\wrappers\python>python setup.py install running 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/…

C
Community

更新:评论指出此处的说明可能很危险。考虑使用 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):设置 VS90COMNTOOLS=%VS100COMNTOOLS%

Visual Studio 2012 (VS11):设置 VS90COMNTOOLS=%VS110COMNTOOLS%

Visual Studio 2013 (VS12):设置 VS90COMNTOOLS=%VS120COMNTOOLS%

Visual Studio 2015 (VS14):设置 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。看看这个答案:stackoverflow.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 应该可以解决您的问题。
p
pradyunsg

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

我已经安装了 Python 2.6。我将mingw32安装到C:\programs\mingw\ 将mingw32的bin目录添加到你的环境变量中:append c:\programs\MinGW\bin;到位于 C:\Python26\Lib\distutils\distutils.cfg 的 PATH 编辑(如果不存在,则创建)distutils.cfg 文件为: [build] compiler=mingw32 现在运行 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 进程就足够了。
我仍然无法解决这个问题。这是错误:easy_install.exe amara 之后的 gcc: error: unrecognized command line option '-mno-cygwin' error: Setup script exited with error: command 'gcc' failed with exit status 1
@user,您应该打开此文件:C:\Python27\Lib\distutils\cygwincompiler.py 并从中删除所有出现的 –mno-cygwin;这是因为最新版本的 GCC 已删除 –mno-cygwin 选项,它不应该存在。
V
Volodymyr Bryliant

您可以从 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装已编译的版本


只是一个提示:您可以通过在 virtualenv 中运行 easy_install binary_installer_built_with_distutils.exe(对应于 this answer)来在 virtualenv 中安装该站点的包。
您还可以wheel convert ....exe这些安装程序,然后随时使用 pip 安装它们。
更准确地说,lfd.uci.edu/~gohlke/pythonlibs/#mysql-python 并在下载后以管理员身份打开终端并运行 python -m pip install <filename>
天哪,这就是当场的。像魅力一样工作,TY :)
J
Josh Bowden

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

运行 python.exe 以显示它是使用哪个版本的 VC++ 编译的(示例如下所示)。使用编译 Python 时使用的 Visual C++ 编译器的相应版本很重要,因为 distilutils 的 get_build_version 防止混合版本(根据 Piotr 的警告)。黄色(顶部)是 Python 2.7,使用 MSC v.1500 (Visual Studio C++ 2008) 编译 红色(底部)是 Python 3.4.1,使用 MSC v.1600 (Visual Studio C++ 2010) 编译 使用下表 [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) 从上一步下载并安装对应版本的Visual Studio C++。下面列出了特定版本的 VC++ 的附加说明。 Visual Studio C++ 2008 注意事项 对于 32 位编译器,请下载 Visual Studio C++ 2008 Express Edition。对于 64 位编译器[2][3],请下载适用于 Windows 7 和 .NET Framework 3.5 SP1 的 Windows SDK。取消选中除开发人员工具 >> Visual C++ 编译器之外的所有内容,以节省安装您不需要的 SDK 工具的时间和磁盘空间。 Visual Studio C++ 2010 的注意事项 根据 Microsoft 的说法,如果您安装了 Visual Studio 2010 SP1,它可能已经删除了 VC++ 的编译器和库。如果是这种情况,请下载 Visual C++ 2010 SP1 编译器更新。 Visual Studio C++ 2015 注意事项 如果不需要 Visual Studio IDE,请下载 Visual Studio C++ 2015 Build Tools。 Visual Studio C++ 2017 注意事项 如果不需要 Visual Studio IDE,请下载 Visual Studio 2017 的 Build Tools。单独的 Python 环境,因此您可以一次使用一个或另一个,而不会弄乱您选择使用哪个 Python 版本的路径。

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

打开一个 cmd.exe 在尝试安装需要 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.bat 和 vcvarsx86_amd64.bat 之间的区别,或者更重要的是 amd64 和 x86_amd64 之间的区别,前者适用于原生 64 位编译器工具,后者是 64 位交叉编译器,可以在 32 位 Windows 安装上运行。更新:如果由于某种原因您收到错误:...此时是意外的。其中 ... 是一系列字符,那么您需要检查路径变量是否包含任何无关字符,例如额外的引号或杂散字符。如果批处理文件一开始就无法理解它,它将无法更新您的会话路径。如果一切顺利,您应该会收到以下消息之一,具体取决于您运行的 VC++ 版本和命令: 对于 32 位编译器工具:设置使用 Microsoft Visual Studio 20xx x86 工具的环境。对于 64 位编译器工具:设置使用 Microsoft Visual Studio 20xx x64 工具的环境。现在,通过 python setup.py install 或 pip install pkg-name Hope 运行设置,并祈祷行星正确对齐,以便 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 中。
C
Community

这是怎么回事? 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 年编辑:Microsoft 为 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://stackoverflow.com/a/13445719/284795 阅读有关 Python 打包的更长篇幅


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

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

微软现在提供了一个捆绑的编译器和头文件,以便能够在令人难忘的 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

微软发布了 Python 2.7 的编译器包,使人们更容易在 Windows 上构建和分发他们的 C 扩展模块。用于 Python 2.7(又名 VC9)的 Microsoft Visual C++ 编译器可从以下网址获得:http://aka.ms/vcpython27 此包包含为 Python 2.7 32 位和 64 位构建 C 扩展模块所需的所有工具和头文件(请注意,某些扩展模块需要 3rd 方依赖项,例如未包含的 OpenSSL 或 libxml2)。还支持使用 Visual C++ 2008 构建的其他 Python 版本,因此“Python 2.7”只是广告——它可以在 2.6 和 3.2 中正常工作。

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

微软表示他们希望保持 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
C
Community

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

我在 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

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


您还需要与 MinGW 兼容的 Python 库版本。有关详细信息,请参阅 eli.thegreenplace.net/2008/06/28/…
曲折:D
Y
YOU

看起来它正在寻找 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 下。有什么建议么?
u
user1592380

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

将mingw32的bin目录添加到环境变量中:将PATH附加到C:\programs\mingw\bin;创建的 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))

C
Christian Long

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

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

来自 http://aka.ms/vcpython27 的 Microsoft Visual C++ Compiler for Python 2.7 一个使用 distutils.core.setup() 的旧包尝试执行 python setup.py 构建而不是使用 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 来构建你的包
A
Ashwini Chaudhary

也许有人会感兴趣,以下为我工作的 py2exe 包。 (我有 Windows 7 64 位和便携式 python 2.7、Visual Studio 2005 Express 和 Windows SDK for Windows 7 和 .NET Framework 4)

set VS90COMNTOOLS=%VS80COMNTOOLS%

然后:

python.exe setup.py install

不,你是对的,我不确定发生了什么,我会删除原来的评论。
很有用!!就我而言,我已经设置了“设置 VS90COMNTOOLS=%VS110COMNTOOLS%”。
@Exzile:是的,您在同一命令提示符会话中键入这些命令
不要这样做!!!有关详细信息,请参阅 this answer
C
Community

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

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

安装 Visual C++ 2010 Express 安装 Microsoft Windows SDK v7.1 for Windows 7 在 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 或其他路径,具体取决于您的安装位置(这似乎是可选的)安装 Microsoft Visual Studio 2010 Service Pack 1 和 Microsoft Visual C++ 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1 之后我尝试 pip install numpy 但收到以下错误:文件“numpy\core\setup.py”,第 686 行,在 get_mathlib_info 中引发 RuntimeError("Broken toolchain: cannot link a simple C 程序") RuntimeError: Broken toolchain: cannot link a simple C program I changed mfinfo to None in C:\Python34\Lib\distutils\msvc9compiler.py per this https://stackoverflow.com/a/23099820/4383472 最后之后pip install numpy 命令我的 avast 防病毒软件试图干扰安装过程s,但我很快就禁用了它

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

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

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


numpy‑1.9.2+mkl‑cp34‑none‑win_amd64.whl - 在上述链接中找不到此文件。
c
chiefenne

我想在 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 之后?
p
peak

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

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

https://i.stack.imgur.com/EvXfE.png


T
Thom Ives

使用此链接下载并安装 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++。
G
Games Brainiac

我尝试了以上所有答案,发现它们都不起作用,这可能是我使用的是 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

并粘贴文件。然后,一切都应该很好。


不,一切都不好我按照你的回答,但我仍然得到同样的错误。
C
Community

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

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


还要确保没有安装其他版本。我很难受。我重新格式化了电脑,只安装了这个版本。因为删除多个版本的 VS 会花费我同样长的时间。
C
Community

我在 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'] 时出现了一个新错误。此错误还有其他 stackoverflow 问题,例如 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,但我注意到 vcvars64.bat 仍然不存在于 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin 及其子文件夹中。 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”(您需要以管理员身份运行):CALL 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;

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


R
Riyas Deen

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

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

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


在执行上述步骤 LINK 时出现链接错误:错误 LNK2001:未解析的外部符号 init__init__ build\temp.win-amd64-2.7\Release_init_.lib:致命错误 LNK1120:1 未解析的外部错误:命令 'C:\\Users\ \ma306477\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\amd64\\link.exe' 失败,退出状态为 1120
u
user2682863

调用 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 对我有用。
C
Community

我尝试了许多解决方案,但只有一个对我有用,即安装 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://stackoverflow.com/a/15319069/2227298 以获取下载链接。


是的,最好的方法是安装VS2008。
N
Nicolas78

如果你安装了 mingw

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

有效,迫使 pip 使用 mingw 编译器而不是微软的编译器来构建。有关详细信息,请参见此处 https://github.com/pypa/pip/issues/18(最后一篇文章)。


M
Michael

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
C
Chris S

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

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

m
mkamioner

我不知道是否为时已晚,但我发现 Microsoft Visual C++ Compiler for Python 2.7 内容如下

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

希望这可以帮助!


C
Community

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

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

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

简单来说:

对于每个版本,都有一个开箱即用的特定 Visual Studio 版本。请注意,2012 年之前的 Express 版本不支持 x64。尝试将一个用于 x64 会导致一个模糊的错误。

请注意,2012 年之前的 Express 版本不支持 x64。尝试将一个用于 x64 会导致一个模糊的错误。

对于独立 SDK,通常需要从 SDK 提示符运行安装(=设置环境变量)。对于某些人来说,这一要求可以通过没有不利副作用的一次性调整来解除

对于某些人来说,这一要求可以通过没有不利副作用的一次性调整来解除

setuptools 支持一些不寻常的 VC++ 版本,而不是 distutils。

据说 MinGW 可以“工作”,但仅适用于 x86。 https://bugs.python.org/issue4709 说它的支持问题在于 MinGW 本身,甚至 x86 自 Python 3.5 以来也必然会出现问题。


V
Vova

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

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

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


D
Dane B

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

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

脚步:

从此处下载最新的 Windows 安装程序 (pyodbc-XXXwin-Y-py2.7.exe) 使用 7-Zip(或 WinRAR 或其他)打开安装程序可执行文件 提取 pyodbc.pyd 和 pyodbc-XXX-py2.7.egg-info并将它们放在[python安装目录或virtualenv]\Lib\site-packages 没有第4步:)


g
gmjonker

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

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


A
Abdul Majeed

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


同样的错误error: Setup script exited with error: Unable to find vcvarsall.bat