【问题标题】:ubuntu 11.04 lxml import etree problem for custom pythonubuntu 11.04 lxml 自定义python的导入etree问题
【发布时间】:2011-07-24 12:37:36
【问题描述】:

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.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$ 

【问题讨论】:

  • 好像是针对 2.7 编译的? ldd /home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg/lxml/etree.so 说什么?跨度>
  • 你是如何安装 lxml 包的?
  • 我通过 pip 和 easy_install 从源代码尝试。但结果总是相同的“从 lxml 导入 etree”引发错误。附言。 “导入 lxml”工作正常。
  • 你用的是2.5版本的easy_install吗?喜欢:/usr/local/python2.5/bin/easy_install-2.5 lxml

标签: python lxml


【解决方案1】:

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

基于此:

“从 lxml 导入 etree”引发“ImportError:/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg /lxml/etree.so:未定义符号:PyUnicodeUCS2_DecodeLatin1

它清楚地表明 lxml 以某种方式被编译为针对错误版本的 Python。通常,此错误源于您将手动编译的 Python 解释器与 Ubuntu 的默认解释器混合的问题,因为 Python 解释器可以使用不同的 unicode 标志编译,而 Ubuntu 使用非默认标志(如果我没记错的话)。

通常我通过

来解决这个问题
  • 创建一个全新的虚拟环境

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      此问题通常是由于在构建 Python 时未在 ./configure 命令上使用 --enable-unicode=ucs4 选项造成的。

      为确保您操作正确,请删除现有的 Python 构建目录并通过解压缩 Python tarball 重新开始构建。

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

      【讨论】:

      • PyUnicodeUCS2_DecodeLatin1 不是暗示 Python 是在 UCS4 模式下构建的,因此缺少上述似乎特定于 UCS2 模式的符号?
      • 我这样做了,然后我得到了ImportError: /home/elias/.virtualenvs/testvenv/lib/python2.7/site-packages/lxml/etree.so: undefined symbol: PyFPE_jbuf。使用pip install lxml --no-use-wheel 安装 lxml 为我解决了这个问题。
      • --no-use-wheel 已弃用尝试--no-binary :all:
      【解决方案4】:

      试试这个在你的 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
      

      【讨论】:

      • 我尝试了从源代码和 pip 安装的不同方法。 “导入 lxml” 工作正常。 “从 lxml 导入 etree”引发“ImportError:/home/se7en/.virtualenvs/e-py25/lib/python2.5/site-packages/lxml-2.2.4-py2.5-linux-i686.egg/lxml/ etree.so:未定义符号:PyUnicodeUCS2_DecodeLatin1 "
      【解决方案5】:

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

      如果它没有使用 2.7 版本,那么它可能仍然在您的系统上编译不正确。可能是发行版的打包错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-17
        • 2021-05-29
        • 2016-04-09
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多