【问题标题】:Python : Import cairo error (2.7 & 3.6) undefined symbol: cairo_tee_surface_indexPython:导入 cairo 错误(2.7 和 3.6)未定义符号:cairo_tee_surface_index
【发布时间】:2018-06-11 11:13:18
【问题描述】:

尝试在 Python 2.7 中导入 gtk 时出现以下错误:

>>> import gtk Traceback (most recent call last): File "<stdin>", line 1, in <module> File "gtk/__init__.py", line 40, in <module> from gtk import _gtk File "/usr/lib/python2.7/site-packages/cairo/__init__.py", line 1, in <module> from ._cairo import * # noqa: F401,F403 ImportError: /usr/lib/python2.7/site-packages/cairo/_cairo.so: undefined symbol: cairo_tee_surface_index

尝试从 Python 3.6 导入 cairo 时出现以下错误:

>>> import cairo Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/site-packages/cairo/__init__.py", line 1, in <module> from ._cairo import * # noqa: F401,F403 ImportError: /usr/lib/python3.6/site-packages/cairo/_cairo.cpython-36m-x86_64-linux-gnu.so: undefined symbol: cairo_tee_surface_index

我按照 BLFS 书中给出的顺序编译和构建模块。 我还安装了书中给出的启用 tee 的 cairo。

我的系统是 LFS,内核版本 4.14.4,Python 2.7.14 和 Python 3.6.4。

编辑:下载源代码并执行“卸载”,然后重新安装。现在我可以毫无错误地导入 cairo。

【问题讨论】:

  • @KarlRichter 我刚刚重新编译了它,它工作了。没有一个答案真的对我有用。

标签: linux python-2.7 pygtk python-3.6 pycairo


【解决方案1】:

我只是换了旧版本的 pycairo。尝试下载版本 1.11.0。

pip uninstall pycairo pip install pycairo==1.11.0

您也可以在其他可用版本上进行转换。 此时;他们是:-

1.11.0, 1.11.1, 1.12.0, 1.13.0, 1.13.1, 1.13.2, 1.13.3, 1.13.4, 1.14.0, 1.14.1, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.15.5, 1.15.6, 1.16.0, 1.16.1, 1.16.2, 1.16.3, 1.17.0, 1.17.1, 1.18.0

我不太了解它的内部结构,我只是使用蛮力来获得解决方案。 希望对您有所帮助。

【讨论】:

  • +1 快速实用的解决方案 - 如果您有依赖于 cairo 的依赖项(igraph),这将以最少的麻烦解决问题。
【解决方案2】:

安装 cairocffi,然后 将import cairocffi 替换为import cairocffi as cairo

【讨论】:

  • +1 这种变通方法实际上有效,但代价是在所有代码中将“import cairo”更改为“import cairocffi as cairo”。奇怪的是官方的cairo包有这个问题。
  • 在 gtk 库中,我究竟在哪里将行更改为 'import cairocffi as cairo'。我还需要 cairo 图书馆吗?
【解决方案3】:
conda install -c conda-forge pycairo

只需使用此命令安装您的 pycairo,它就可以正常运行。不需要做任何事情。

【讨论】:

    【解决方案4】:

    我正在使用 conda,但我遇到了同样的问题,但由于 conda env,路径略有不同: ImportError: /home/juro/anaconda3/envs/py37/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so: undefined symbol: cairo_tee_surface_index $ ldd /home/juro/anaconda3/envs/py37/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so $ outputs: ... libcairo.so.2 => /home/juro/anaconda3/envs/py37/lib/libcairo.so.2 (0x00007ff6d8ad9000) ...

    似乎 conda (anaconda) 包 cairo 坏了或 pip pycairo 包坏了(我不知道是谁的错;))。它在“libcairo.so.2”库中缺少符号 cairo_tee_surface_index。 pycairo 包(pip install pycairo)需要该符号,因此当您执行“import cairo”时会出现该错误。

    您有以下选择:

    1. 我发现我的系统 (debian) libcairo.2 缺少那个符号: $ strings /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.8 | grep cairo_tee_surface_index。所以我只是将我的 conda 的 cairo 降级到与我的系统 conda install cairo=version 相同的版本,并将我的系统 libcairo 复制到我的 conda libcairo:cp /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.8 ~/anaconda3/lib/libcairo.so.2.11400.8 上。您可以备份原始的,但不要使用移动命令 (mv),因为这些库是硬链接(这些库可以在多个 conda 环境之间共享)。仅使用 cp 进行备份。
    2. 您可以使用 chrpath 命令 (man chrpath) 更改“_cairo.cpython-36m-x86_64-linux-gnu.so”库文件中的 RPATH,以指向正确的 libcairo.so.2 文件夹。正确的意思是使用 cairo_tee_surface_index 符号构建库。
    3. 构建您自己的 cairo 库(与您的 conda '$ conda list cairo' 中的版本相同)并将其复制到 ~/anaconda3/lib/libcairo.so.2.{additional_version_characters}。

    您系统的 libcairo 在哪里? /sbin/ldconfig -p | grep libcairo

    【讨论】:

      【解决方案5】:

      对我来说,
      ldd /usr/lib64/python3.6/site-packages/cairo/_cairo.cpython-36m-x86_64-linux-gnu.so
      显示: libcairo.so.2 => /usr/local/lib/libcairo.so.2

      我有一个陈旧的自编译 cairo 安装。如果你还有原来的编译树,你可以在里面运行make uninstall。否则,只需将 /usr/local/lib 中的有问题的 cairo 文件手动移动到另一个位置,并在确定文件不需要时删除。

      【讨论】:

      • ldd 没有在 /usr/local/lib/ 中为 cairo 库显示任何库
      【解决方案6】:

      我发现根本错误是找不到py3cairo.h

      只需 locate py3cairo.hln -s /usr/include/pycairo/py3cairo.h /usr/include/py3cairo.h

      然后编译不会出错。

      【讨论】:

        【解决方案7】:

        这是 Juraj Michalak 的第一个解决方案,conda: undefined symbol: cairo_tee_surface_index,有详细的过程。

        >>> import cairo
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "/home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/__init__.py", line 1, in <module>
            from ._cairo import *  # noqa: F401,F403
        ImportError: /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so: undefined symbol: cairo_tee_surface_index
        

        我在cairo (1.14.12) 中都有cairo_tee_surface_index 符号,但在它使用的libcairo 中没有:

        ldd /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so
            libcairo.so.2 => /home/lalebarde/anaconda3/lib/libcairo.so.2 (0x00007f5a82de8000)
        strings /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so | grep cairo_tee_surface_index
        cairo_tee_surface_index
        cairo_tee_surface_index
        cairo_tee_surface_index
        strings /home/lalebarde/anaconda3/lib/libcairo.so.2 | grep cairo_tee_surface_index
        

        我的系统一没问题(1.14.8-1):

        strings /usr/lib/x86_64-linux-gnu/libcairo.so.2 | grep cairo_tee_surface_index
        cairo_tee_surface_index
        

        所以,我尝试将conda环境下的cairo降级到我的系统版本(从conda repo here下载版本1.14.8),以替换默认库由缺少符号的系统:

        conda uninstall cairo
        The following packages will be REMOVED:
          cairo-1.14.12-h8948797_3
        conda install cairo-1.14.8-0.tar.bz2
        

        再说一遍:

        ldd /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so 
            libcairo.so.2 => /home/lalebarde/anaconda3/lib/libcairo.so.2 (0x00007f9b163c9000)
        strings /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so | grep cairo_tee_surface_index
        cairo_tee_surface_index
        cairo_tee_surface_index
        cairo_tee_surface_index
        strings /home/lalebarde/anaconda3/lib/libcairo.so.2 | grep cairo_tee_surface_index
        

        不过是意料之中。现在我将其替换为系统一:

        cp /home/lalebarde/anaconda3/lib/libcairo.so.2 /home/lalebarde/anaconda3/lib/libcairo.so.2.old
        cp /usr/lib/x86_64-linux-gnu/libcairo.so.2 /home/lalebarde/anaconda3/lib/
        strings /home/lalebarde/anaconda3/lib/libcairo.so.2 | grep cairo_tee_surface_index
        cairo_tee_surface_index
        

        现在,import cairo 工作了!

        【讨论】:

          【解决方案8】:

          我在安装 PyGObject 时遇到了类似的问题。

          File "/tmp/pip-build-env-dyg6e3zi/overlay/lib/python3.7/site-packages/cairo/__init__.py", line 1, in <module>
                from ._cairo import *  # noqa: F401,F403
            ImportError: /tmp/pip-build-env-dyg6e3zi/overlay/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so: undefined symbol: cairo_svg_surface_set_document_unit
            ----------------------------------------
            ERROR: Failed building wheel for PyGObject
          

          以下步骤对我有用。 首先确保您没有使用 conda,因为它的路径会有所不同。那么,

          sudo apt update
          sudo apt install python3-pip -y
          

          安装这些依赖项

          sudo apt install libjpeg8-dev zlib1g-dev libtiff-dev libfreetype6 libfreetype6-dev libwebp-dev libopenjp2-7-dev libopenjp2-7-dev -y
          

          还普遍更新 pip。

          sudo -H pip3 install -U pip
          

          【讨论】:

            猜你喜欢
            • 2016-02-03
            • 1970-01-01
            • 2021-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-23
            • 1970-01-01
            • 2014-10-03
            相关资源
            最近更新 更多