首页 文章

ubuntu 11.04 lxml导入自定义python的etree问题

提问于
浏览
11

ubuntu 11.04有本机python2.7我从源码到/usr/local/python2.5/bin构建python2.5,并尝试为我的自定义python2.5安装安装lxml . 我也使用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 env,一切正常,但在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

    此问题通常是由于在不使用 ./configure 命令的 --enable-unicode=ucs4 选项的情况下构建Python而引起的 .

    要确保正确执行,请删除现有的Python构建目录,然后通过解压缩Python tarball再次开始构建 .

    此外,删除现有的Python 2.5安装目录 /usr/local/python2.5/ 并重建您构建的所有其他内容,例如lxml . 使用已编译组件的任何扩展都将查找Python构建配置,因此如果您不重建所有内容,则会出现不匹配的内容 .

  • 15

    您不能直接符号链接不同的Python版本或本机库,因为Python DLL格式会在主要Python版本之间发生变化 .

    基于此:

    “来自lxml import etree”raise“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使用非默认标志(如果我没记错的话) .

    通常我通过解决这个问题

    • 创造一个新鲜的虚拟世界

    • 使用easy_install在此virtualenv下重新安装lxml

    • 使用-v开关和Python运行Python将打印它尝试导入的所有内容

    • 如果它仍在从错误的位置导入内容,则virtualenv或您的本机库设置已损坏

    • 可以使用手动lib构建和LD_LIBRARY_PATH环境变量覆盖本机库设置

    • 如果virtualenv没有针对你正确的Python版本构建lxml,那就是virtualenv bug(只要你能展示如何以可重复的方式重现它) . 但是,我们已经成功地将lxml与Ubuntu,virtualenv和各种Python版本一起使用,因此我怀疑是否存在错误 .

    还有一种方法可以使用名为buildout的工具进行静态lxml安装(有点像virtualenv,但要复杂得多):

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

  • 3

    试试这个在你的virtualenv下安装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
    
  • 1

    我使用命令 sudo apt-get remove python-lxml 卸载了现有的lxml(我使用 sudo apt-get install python-lxml 安装) . 我手动安装了lxml 4.0.0 . 这解决了我的问题 . 我认为这个新版本是经过调试的 .

  • 0

    从我发现的this线程中,他们似乎在说这个问题可能是由针对错误的Python版本编译的程序引起的 . 2.7对2.5,它可能是你的问题的原因 . 检查你的sys.path并查看它是否使用2.7版本,这可能是你问题的根源!

    如果它没有使用2.7,也许它仍然在您的系统上编译错误 . 也许这是你的发行版的包装错误 .

相关问题