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

2024-05-18 23:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: gnuhomeegglinuxlibpackagesusrsite
3条回答

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

基于此:

“from lxml import etree”raise“importterror:/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg/lxml/etree.so:未定义的符号:PyUnicodeUCS2}decodelating1

它清楚地指出,lxml是根据错误的Python版本编译的。通常,这个错误源于您将手动编译的Python解释器与Ubuntu的默认解释器混合使用的问题,因为Python解释器可以使用不同的unicode标志进行编译,Ubuntu使用非默认标志(如果我没记错的话)。

通常我通过

  • 创建新的virtualenv

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

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

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

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

  • 如果virtualenv没有根据正确的Python版本构建lxml,那么它就是virtualenv bug(只要您能够演示如何以可重复的方式重现它)。但是,我们已经成功地将lxml与Ubuntu、virtualenv和各种Python版本一起使用,所以我怀疑是否存在bug。

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

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

尝试在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

这个问题通常是由于在没有使用./configure命令上的--enable-unicode=ucs4选项的情况下构建Python引起的。

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

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

相关问题 更多 >

    热门问题