我敢打赌您不会为此使用 VS 2008 :)
There's def find_vcvarsall(版本):distutils 中的函数(猜猜看,它会查找 vcvarsall.bat),并带有以下注释
首先它试图找到
注册表中VS 2008的productdir。
如果失败,它会退回到
VS90COMNTOOLS 环境变量。
如果您没有使用 VS 2008,那么您既没有注册表项,也没有合适的环境变量,这就是 distutils 找不到 vcvarsall.bat 文件的原因。确实如此not检查是否可以通过 PATH 环境变量访问 bat 文件。
解决方案是定义VS90COMNTOOLS变量指向Visual Studio的Tools目录。
话虽这么说,看看11.4。 distutils.msvccompiler — 微软编译器Python 文档中的部分指出
通常,扩展模块需要
使用相同的编译器编译
它被用来编译Python。
马丁诉洛伊斯 (Martin v. Loewis) 的电子邮件标题为立即下载 Visual Studio Express 2008在 python-list 邮件列表上声明相同
Python 2.6、2.7 和 3.1 均已构建
随着该版本(即 2008 年)。因为
另一个悠久的传统,Python
扩展模块必须使用
相同的编译器版本(更多
具体来说,CRT 版本)作为 Python
本身。所以要构建扩展模块
对于任何这些版本,您需要
有 VS 2008 或 VS 2008 的副本
表达。
鉴于上述陈述,您should如果您想为 Python 2.7 构建 lxml,请使用 VS 2008,因此尽管设置 VS90COMNTOOLS 可以查找 vcvarsall.bat 文件,但它不是the解决方案。
话虽这么说:)人们确实尝试使用较旧的 CRT 和较新的编译器:
我可以将 Visual Studio 2010 的 C++ 编译器与 Visual Studio 2008 的 C++ 运行时库一起使用吗?
如何强制 C++ 编译器使用特定的 CRT 版本?
VS 2008 - 链接到较旧的 C 运行时
我要感谢线程中的 Kev Dwyer(指出了所使用的 VS 版本的重要性)和 Stefan Behnel(向我指出 distutils 作为处理编译器配置的地方)在 Windows 下构建 lxml 时出现问题 - 错误:无法找到 vcvarsall.bat在 lxml 邮件列表上。我还想感谢阿格伦霍尔姆从 freenode #distutils IRC 频道确认 distutils 确实包含查找 vcvarsall.bat 文件的代码。