Python:导入 cairo 错误(2.7 和 3.6)未定义符号:cairo_tee_surface_index

Posted

技术标签:

【中文标题】Python:导入 cairo 错误(2.7 和 3.6)未定义符号:cairo_tee_surface_index【英文标题】:Python : Import cairo error (2.7 & 3.6) undefined symbol: 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 我刚刚重新编译了它,它工作了。没有一个答案真的对我有用。 【参考方案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”时会出现该错误。

您有以下选择:

    我发现我的系统 (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 进行备份。 您可以使用 chrpath 命令 (man chrpath) 更改“_cairo.cpython-36m-x86_64-linux-gnu.so”库文件中的 RPATH,以指向正确的 libcairo.so.2 文件夹。正确的意思是使用 cairo_tee_surface_index 符号构建库。 构建您自己的 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

【讨论】:

以上是关于Python:导入 cairo 错误(2.7 和 3.6)未定义符号:cairo_tee_surface_index的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 错误(python 2.7):sdl2 导入错误

在 Python 2.7 中出现“ImportError:无法导入名称 HTTPSConnection”错误

出现错误:DLL 加载失败:操作系统无法运行 %1 - Python 2.7;报废模块;导入密码学

使用 python 2.7 导入 hashlib 而不是 2.6 时出错

App Engine Python 2.7 - ImportError:无法导入名称 apiproxy

在虚拟环境python 2.7 pycharm中安装后无法导入请求