在 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