Ubuntu 11.04 自定义 Python 导入 lxml.etree 问题

12 投票
5 回答
10302 浏览
提问于 2025-04-16 22:10

在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 个回答

1

试试这个方法在你的虚拟环境中安装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
4

你不能直接使用符号链接来连接不同版本的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安装的方法(有点像虚拟环境,但复杂得多):

http://groups.google.com/group/gomobile-dev/browse_thread/thread/7f5e34e991cfdaa9/c65b70e7a9422ebf?#c65b70e7a9422ebf

15

这个问题通常是因为在用 ./configure 命令构建 Python 时,没有加上 --enable-unicode=ucs4 这个选项造成的。

为了确保你能正确操作,先删除现有的 Python 构建目录,然后重新解压 Python 的压缩包开始构建。

另外,还要删除现有的 Python 2.5 安装目录 /usr/local/python2.5/,然后重新构建你之前构建的其他东西,比如 lxml。任何使用了编译组件的扩展都会查看 Python 的构建配置,所以如果你不把所有东西都重新构建一遍,就会出现不匹配的情况。

撰写回答