需要帮助在OS X 10.7上安装lxml

5

我一直在努力学习如何使用from lxml import etree(顺便说一下,import lxml可以正常工作)。错误信息如下:

ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-            packages/lxml/etree.so, 2): Symbol not found: _htmlParseChunk
Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lxml/etree.so
Expected in: flat namespace
in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lxml/etree.so

我使用pip安装lxml,并使用homebrew重新安装了具有正确架构的libxml2(至少我认为是这样)...有人有想法如何修复/诊断此问题吗?我正在使用64位Python。


尝试在 etree.so 上使用 otool -L 命令,查看它正在搜索哪些库路径。 - Ned Deily
那个输出是 etree.so: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1),我不确定我应该如何处理这些信息。 - Pat B
尽管我注意到路径上没有文件,但它仍然输出了该路径。 - Pat B
1个回答

12

lxml有点挑剔,它使用的第三方库通常需要比苹果提供的更新版本。建议您阅读并按照此处的说明在Mac OS X上构建lxml,包括构建其自己的静态链接库。那应该可行。(我有点惊讶homebrew没有一个lxml配方。)

更新:根据您评论中的有限信息,很难确定发生了什么。我怀疑您没有使用您认为的Python版本。有很多种方法可以成功安装lxml;这是问题的一部分:选项太多了。与其尝试调试您的设置,也许在10.7上使用由Apple提供的系统Python 2.7获得工作的lxml的最简单方法如下。

$ sudo STATIC_DEPS=true /usr/bin/easy_install-2.7 lxml

您随后应该能够以这种方式使用 lxml.etree

$ /usr/bin/python2.7
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> etree.__file__
'/Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so'
>>> 

我注意到 lxml 的静态构建过程无法生成可用的通用构建。在 lxml 安装期间,您可能会看到类似于以下消息:

ld: warning: ignoring file /private/tmp/easy_install-83mJsV/lxml-2.3.1/build/tmp/libxml2/lib/libxslt.a, file was built for archive which is not the architecture being linked (i386)

假设您的计算机默认架构为64位,如果您尝试以32位模式运行:
$ arch -i386 /usr/bin/python2.7
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:06) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so, 2): Symbol not found: _htmlParseChunk
  Referenced from: /Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so
  Expected in: flat namespace
 in /Library/Python/2.7/site-packages/lxml-2.3.1-py2.7-macosx-10.7-intel.egg/lxml/etree.so
>>> ^D

这就是你最初报告的错误信息!因此,该问题的根本原因似乎是 lxml 构建的静态库(如 libxml2 等)不是通用的。只要您不需要在 32 位进程中使用 lxml(对于大多数用途来说不太可能),这应该不是问题。很有可能你最初使用的 Python 是仅支持 32 位的;这与你报告的一些其他消息是一致的。


好的,我刚刚完成了安装并注意到安装结束时出现了以下警告:此公式仅限于Keg,因此它未被符号链接到/usr/local中。Mac OS X已经提供了这个程序,安装另一个版本可能会引起各种问题。通常情况下,这对您没有任何影响。 如果您构建自己的软件并且需要此公式,则需要将其lib和include路径添加到构建变量中:LDFLAGS -L/usr/local/Cellar/libxslt/1.1.26/lib CPPFLAGS -I/usr/local/Cellar/libxslt/1.1.26/include - Pat B
那是不是意味着当我pip安装lxml时需要做一些事情? - Pat B
安装了Homebrew的libxslt后,我仍然遇到相同的错误。我在想lxml是否正在使用错误的libxml2和libxslt来进行构建,这可能吗? - Pat B
我一直在使用Inkscape为我的iOS应用程序创建图标。当我尝试渲染一个齿轮时,会收到一条消息:“inkex.py需要libxml2的fantastic lxml包装器,因此需要此扩展程序。请从http://cheeseshop.python.org/pypi/lxml/下载并安装最新版本,或通过类似于以下命令的软件包管理器进行安装:sudo apt-get install python-lxml”。在寻找解决方案时,我找到了这个帖子,但我不确定它是否相关。对于不懂Python的人有什么建议吗? - Victor Engel
对于在Anaconda上使用Scrapy遇到问题的人,这个方法对我有效。 - yukclam9
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接