Ubuntu 11.04 自定义 Python 导入 lxml.etree 问题
在ubuntu 11.04系统上,系统自带的是python2.7。我从源代码编译了python2.5,并把它安装到/usr/local/python2.5/bin目录下。我还使用了virtualenv来创建一个虚拟环境。然后我切换到这个环境,使用python2.5来导入lxml库,但出现了错误。
from lxml import etree
ImportError: /home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg/lxml/etree.so: undefined symbol: PyUnicodeUCS2_DecodeLatin1
在python2.7的环境下,一切正常,但在python2.5中导入却失败了。请问如何解决python2.5中的这个问题呢?
我运行了这个命令:ldd /home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg/lxml/etree.so
结果是:
(e-py25)se7en@se7en-R510-P510:~/downloads/lxml-2.2.4$ ldd /home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg/lxml/etree.so
linux-gate.so.1 => (0x00968000)
libxslt.so.1 => /usr/lib/libxslt.so.1 (0x005aa000)
libexslt.so.0 => /usr/lib/libexslt.so.0 (0x00110000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00db3000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x00a22000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00564000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00123000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x0013c000)
libgcrypt.so.11 => /lib/i386-linux-gnu/libgcrypt.so.11 (0x0029d000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00d6e000)
/lib/ld-linux.so.2 (0x004fc000)
libgpg-error.so.0 => /lib/i386-linux-gnu/libgpg-error.so.0 (0x00879000)
(e-py25)se7en@se7en-R510-P510:~/downloads/lxml-2.2.4$
5 个回答
试试这个方法在你的虚拟环境中安装lxml,希望你不会遇到任何错误。
/home/se7en/.virtualenvs/e-py25/bin/activate
easy_install pip # if you don't have it already
pip install lxml
python -c 'import lxml' # to confirm all is good
你不能直接使用符号链接来连接不同版本的Python或本地库,因为Python的DLL格式在主要版本之间是有变化的。
根据这个情况:
"from lxml import etree" 报错 "ImportError: /home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg/lxml/etree.so: undefined symbol: PyUnicodeUCS2_DecodeLatin1
这个错误清楚地表明,lxml在某种程度上是与错误版本的Python编译在一起的。通常,这个错误是因为你把手动编译的Python解释器和Ubuntu默认的解释器混在了一起,因为Python解释器可以用不同的unicode标志编译,而Ubuntu使用的是非默认的标志(如果我没记错的话)。
我通常通过以下方式解决这个问题:
创建一个新的虚拟环境(virtualenv)
在这个虚拟环境中使用easy_install重新安装lxml
运行Python时加上-v选项,这样Python会打印出它尝试导入的所有内容
如果它仍然从错误的位置导入东西,那么你的虚拟环境或本地库的设置可能已经损坏
本地库的设置可以通过手动构建库和LD_LIBRARY_PATH环境变量来覆盖
如果虚拟环境没有根据你正确的Python版本构建lxml,那就是虚拟环境的bug(只要你能展示如何重复这个问题)。不过,我们已经成功地在Ubuntu、虚拟环境和各种Python版本上使用lxml,所以我怀疑这有bug。
还有一种使用叫做buildout的工具进行静态lxml安装的方法(有点像虚拟环境,但复杂得多):
这个问题通常是因为在用 ./configure
命令构建 Python 时,没有加上 --enable-unicode=ucs4
这个选项造成的。
为了确保你能正确操作,先删除现有的 Python 构建目录,然后重新解压 Python 的压缩包开始构建。
另外,还要删除现有的 Python 2.5 安装目录 /usr/local/python2.5/
,然后重新构建你之前构建的其他东西,比如 lxml。任何使用了编译组件的扩展都会查看 Python 的构建配置,所以如果你不把所有东西都重新构建一遍,就会出现不匹配的情况。