在 Windows 上为 Python 2.7 构建 lxml

Posted

技术标签:

【中文标题】在 Windows 上为 Python 2.7 构建 lxml【英文标题】:Building lxml for Python 2.7 on Windows 【发布时间】:2011-03-04 02:47:52 【问题描述】:

我正在尝试在 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 有问题

【问题讨论】:

如果你碰巧使用 AMD64,你可以试试这些:lfd.uci.edu/~gohlke/pythonlibs @Christo 你有关于如何生成这些可执行文件的说明吗? 我没有编译这些,所以最好联系作者:lfd.uci.edu/~gohlke 你使用什么版本的 Visual Studio? 【参考方案1】:

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

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

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

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

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

话虽如此,请查看 Python 文档中的 11.4. distutils.msvccompiler — Microsoft Compiler 部分

通常,扩展模块需要 用同一个编译器编译 用于编译 Python。

Martin v. Loewis 在 python-list 邮件列表中标题为 Download Visual Studio Express 2008 now 的电子邮件中声明相同

Python 2.6、2.7 和 3.1 均已构建 与该版本(即 2008 年)。因为 另一个悠久的传统,Python 扩展模块必须用 相同的编译器版本(更多 具体来说,CRT 版本)作为 Python 本身。所以要构建扩展模块 对于这些版本中的任何一个,您需要 拥有 VS 2008 或 VS 2008 的副本 快递。

根据上述陈述,如果您想为 Python 2.7 构建 lxml,您应该使用 VS 2008,因此虽然设置 VS90COMNTOOLS 会负责查找 vcvarsall.bat 文件,但它不是 strong> 解决方案。

话虽如此 :) 人们确实会尝试将旧版 CRT 与新版编译器一起使用:Can I use Visual Studio 2010's C++ compiler with Visual Studio 2008's C++ Runtime Library?How to Enforce C++ compiler to use specific CRT version?VS 2008 - Link against older C runtime

我要感谢 Kev Dwyer(指出所使用的 VS 版本的重要性)和 Stefan Behnel(将我指向 distutils 作为处理编译器配置的地方)在 lxml 邮件上的线程 Problem building lxml under Windows - error: Unable to find vcvarsall.bat列表。我还要感谢 freenode #distutils IRC 频道的 agronholm 确认 distutils 确实包含查找 vcvarsall.bat 文件的代码。

【讨论】:

好的,你解释过了,但是在没有vs2008的情况下需要做什么呢? 好吧,冗长而曲折的答案......但它仍然没有解释如何真正解决这个人遇到的问题? @ziyuang 这意味着你使用的是使用 Microsoft Visual Studio 2010 的 Python 3.3。如果是这样,那么答案是肯定的,你应该安装这个版本。 @PiotrDobrogost 谢谢。然后我遇到了这个 ValueError: ['path'] 错误:***.com/q/4676728/688080 。看来我应该安装专业版而不是快速版。 Visual C++ 2008 Express 在这里可用go.microsoft.com/?linkid=7729279【参考方案2】:

遵循推荐的解决方案后:

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

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

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

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

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

编辑。由于this distutils bug 中描述的问题,移动目录有效。

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

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

    在 Python 命令提示符下输入 MSVC

    SET DISTUTILS_USE_SDK=1

    SET MSSdk=1

    python.exe setup.py ...

【讨论】:

【参考方案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

【讨论】:

【参考方案4】:

https://github.com/develersrl/gccwinbinaries

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

【讨论】:

以上是关于在 Windows 上为 Python 2.7 构建 lxml的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac 上为 Python 2.7 使用 matplotlib

在 SLES 11 上为所有用户安装 Python 2.7

在 python 2.7 上安装 tensorflow

在pip上为python 2.7安装py2exe:这个包需要Python 3.3或更高版本

在 linux 上为非默认版本安装 python 模块

在 MacOS Mojave 上为 QGIS 安装 Python 3.6