我想在我的unix系统中安装lxml模块,但它不起作用。问题是未能引用符号:
Python 2.6.4 (r264:75706, Sep 12 2010, 18:46:30) [C] on sunos5
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: ld.so.1: isapython2.6: fatal: relocation error: file lxml/etree.so: symbol __xmlStructuredErrorContext: referenced symbol not found
但是,ldd
命令的输出是:
$ ldd lxml/etree.so
libxslt.so.1 => /usr/lib/libxslt.so.1
libexslt.so.0 => /usr/lib/libexslt.so.0
libxml2.so.2 => /lib/libxml2.so.2
libz.so.1 => /lib/libz.so.1
libm.so.2 => /lib/libm.so.2
libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0
libgcc_s.so.1 => /usr/sfw/lib/libgcc_s.so.1
libpthread.so.1 => /lib/libpthread.so.1
libsocket.so.1 => /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libc.so.1 => /lib/libc.so.1
libdl.so.1 => /lib/libdl.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
并发现:
$ nm /lib/libxml2.so.2 | grep __xmlStructuredErrorContext
000a99e8 t __xmlStructuredErrorContext
这让我感到恶心。有一个符号,为什么它只是无法链接?我缺少什么吗?
答案 0 :(得分:2)
确定。这个问题来自很久以前。我发现了原因:
通知:
$ nm /lib/libxml2.so.2 | grep __xmlStructuredErrorContext
000a99e8 t __xmlStructuredErrorContext
此符号的属性为t
,属于本地,不会被导出。它发生的原因是图书馆太旧了。
但遗憾的是,如果您正在使用solaris
系统,如果您尝试通过从源代码编译来更新libxml2
,则会因为编译器或源代码中的错误而失败。进一步参考:http://blog.gmane.org/gmane.comp.gnome.lib.xslt/month=20110201
实际上有一个捷径可以使用lxml
安装openCSW
预编译包:
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i python27 py_lxml
它会起作用。
答案 1 :(得分:0)
Solaris Sparc(5.11)上的Python3遇到相同的问题。 lxml的OpenCSW版本仅适用于Python 2,因此必须执行以下操作:
libxml2.so.2 -> libxml2.so.2.9.3 libxml2.so.2.9.3 libz.so.1 -> libz.so.1.2.8 libz.so.1.2.8