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

时间:2018-01-01 11:26:37

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

尝试在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书中给出的顺序编译和构建模块。 我也安装了cairo,如书中所示,启用了tee。

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

编辑:下载了源代码并进行了卸载&#39;然后重新安装它。现在我可以导入cairo而不会出现任何错误。

8 个答案:

答案 0 :(得分:1)

安装cairocffi,和 将import cairocffi替换为import cairocffi as cairo

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我正在使用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)需要该符号,因此,当您“导入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上相同的版本,并在conda libcairo上复制了系统libcairo:cp /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.8 ~/anaconda3/lib/libcairo.so.2.11400.8。您可以备份原始库,但不要使用move命令(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

答案 3 :(得分:0)

我只是转移了旧版本的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

显然;我了解不多,但我只是用蛮力解决。 希望对您有所帮助。

答案 4 :(得分:0)

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

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

然后编译正常进行。

答案 5 :(得分:0)

这与 Juraj Michalak 的第1号解决方案具有condaundefined 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_tee_surface_index(1.14.12)中都有cairo符号,但在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

因此,我试图在cairo环境下将conda降级到我的系统版本(从1.14.8版的conda repo here下载),以便用缺少符号的系统之一替换默认库:

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可以工作了!

答案 6 :(得分:0)

在安装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

还可以普遍更新点子。

sudo -H pip3 install -U pip

答案 7 :(得分:0)

conda install -c conda-forge pycairo

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