35

我正在尝试在 Windows 64 位机器上为 Python 2.7 构建 lxml。我找不到 Python 2.7 版本的 lxml 鸡蛋。所以我从源代码编译它。我正在按照本网站上的说明进行操作

http://lxml.de/build.html

在静态链接部分下。我收到错误

C:\Documents and Settings\Administrator\Desktop\lxmlpackage\lxml-2.2.6\lxml-2.2.
6>python setup.py bdist_wininst --static
Building lxml version 2.2.6.
NOTE: Trying to build without Cython, pre-generated 'src/lxml/lxml.etree.c' need
s to be available.
ERROR: 'xslt-config' is not recognized as an internal or external command,
operable program or batch file.

** make sure the development packages of libxml2 and libxslt are installed **

Using build configuration of libxslt
Building against libxml2/libxslt in one of the following directories:
  ..\libxml2-2.7.6--win32--w2k--x64\lib
  ..\libxslt-1.1.26--win32--w2k--x64--0002\lib
  ..\zlib-1.2.4--win32--w2k--x64
  ..\iconv-1.9.1--win32--w2k--x64-0001\lib
running bdist_wininst
running build
running build_py
running build_ext
building 'lxml.etree' extension
error: Unable to find vcvarsall.bat

谁能帮我这个?我尝试设置 Microsoft Visual Studio 的路径。我可以从命令行运行 vcvarsall.bat 。但是 python 有问题

4

4 回答 4

61

我打赌你没有为此使用 VS 2008 :)

distutils 中有def find_vcvarsall(version): function (猜猜看,它会查找 vcvarsall.bat),并带有以下注释

起初它试图在注册表中找到 VS 2008 的 productdir。如果失败,它会退回到 VS90COMNTOOLS 环境变量。

如果您没有使用 VS 2008,那么您既没有注册表项也没有合适的环境变量,这就是 distutils 找不到 vcvarsall.bat 文件的原因。它不检查是否可以通过 PATH 环境变量访问 bat 文件。

解决方案是定义 VS90COMNTOOLS 变量指向 Visual Studio 的 Tools 目录。

话虽这么说,看看11.4。distutils.msvccompiler — Python 文档中的 Microsoft Compiler 部分,其中指出

通常,扩展模块需要使用与编译 Python 相同的编译器进行编译。

Martin v. Loewis 在标题为“立即在 python-list 邮件列表上下载 Visual Studio Express 2008 ”的电子邮件中声明相同

Python 2.6、2.7 和 3.1 都是使用该版本(即 2008)构建的。由于另一个悠久的传统,Python 扩展模块必须使用与 Python 本身相同的编译器版本(更具体地说,CRT 版本)构建。因此,要为任何这些版本构建扩展模块,您需要拥有 VS 2008 或 VS 2008 Express 的副本。

鉴于上述陈述,如果您想为 Python 2.7 构建 lxml,则应该使用 VS 2008,因此尽管设置 VS90COMNTOOLS 会负责查找 vcvarsall.bat 文件,但这不是解决方案。

话虽如此 :) 人们确实尝试将旧 CRT 与新编译器一起使用:
我可以将 Visual Studio 2010 的 C++ 编译器与 Visual Studio 2008 的 C++ 运行时库一起使用吗?
如何强制 C++ 编译器使用特定的 CRT 版本?
VS 2008 - 链接到旧的 C 运行时

我要感谢 Kev Dwyer(指出所使用的 VS 版本的重要性)和 Stefan Behnel(将我指向 distutils 作为处理编译器配置的地方)在Windows 下构建 lxml 问题的线程问题 - 错误:无法在 lxml 邮件列表中查找 vcvarsall.bat 。我还要感谢freenode #distutils IRC 频道的 agronholm 确认 distutils 确实包含查找 vcvarsall.bat 文件的代码。

于 2011-02-25T20:54:42.263 回答
4

遵循推荐的解决方案后:

  1. 从 Microsoft下载VCForPython27.msi ,
  2. 安装它 (Win7, Python(x, y) 2.7.9 32bit),
  3. 输入/更新环境变量VS90COMNTOOLS到安装目录值(C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\9.0)

我的问题仍然存在(想在 C 中构建 Python 扩展)。

在现在一切正常之前,我必须进行以下 2 个令人难以置信的肮脏调整:

  1. 修改" C:\Python27\Lib\distutils"中的"msvc9compiler.py" ,函数find_vcvarsall,现在指向"Visual C++ for Python"而不是"VC"
  2. 将“C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\9.0\”下的目录创建者复制到“​​C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\”(即向上一级目录)。

我不知道谁在这里做错了——可能是我。

编辑。由于这个 distutils 错误中描述的问题,移动目录有效。

即使设置了 VS90COMNTOOLS,msvc9compiler 也无法找到 vcvarsall.bat,因为它安装在%installdir%/vcvarsall.bat而不是%installdir%/VC/vcvarsall.bat

所描述的解决方法是使用 Visual C++ 命令提示符:

  1. 输入 MSVC for Python 命令提示符

  2. 设置 DISTUTILS_USE_SDK=1

  3. 设置 MSSdk=1

  4. python.exe 安装程序.py ...

于 2015-01-20T16:28:05.323 回答
3

Jorj McKie 几乎是正确的:确实安装VCForPython27.msi是不够的,是的,distutils 中存在一个问题,阻止它找到 find_vcvarsall。实际上问题不直接出在 distutils 中,而在于 VCForPython27.msi 的打包方式以及 vcvarsall.bat 的放置位置(文件夹布局与 VS2008 SDK 不同)。

同时,一个简单的解决方法可能会在 Python 2.7.11 中得到修补:使用 setuptools 而不是 distutils。

如果您被 distutils 卡住,另一种手动解决方法:

1) Enter MSVC for Python command prompt
2) SET DISTUTILS_USE_SDK=1
3) SET MSSdk=1
4) you can then build your C extensions: python.exe setup.py ...

Gregory Szorc 的错误报告和解决方法:http: //bugs.python.org/issue23246

更多信息和在 IPython 中使用 %%cython 魔法的解决方法:https ://github.com/cython/cython/wiki/CythonExtensionsOnWindows

于 2015-04-05T19:14:43.283 回答
0

https://github.com/develersrl/gccwinbinaries

我有类似的问题。除了使用安装向导和设置一个首选项外,这无需任何其他操作即可立即生效。

于 2015-07-18T00:33:46.920 回答