尝试在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而不会出现任何错误。
答案 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”时会遇到该故障。
您有以下选择:
$ 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进行备份。系统的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.h
和ln -s /usr/include/pycairo/py3cairo.h /usr/include/py3cairo.h
然后编译正常进行。
答案 5 :(得分:0)
这与 Juraj Michalak 的第1号解决方案具有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_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,它就可以正常运行。不需要做任何事情。