当我尝试在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。
编辑:下载了源代码,并做了“使卸载”,然后重新安装它。现在我可以导入开罗没有任何错误。
9条答案
按热度按时间eagi6jfj1#
安装cairrocffi,并将
import cairocffi
替换为import cairocffi as cairo
。mftmpeh82#
我正在使用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(水蟒)包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
相同的版本,并把我的系统libcairo复制到我的conda libcairo上:cp /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.8 ~/anaconda3/lib/libcairo.so.2.11400.8
。你可以备份原始的,但是不要使用mov命令,因为那些库是硬链接(那些库可以在多个conda环境中共享)。只使用cp来备份。1.您可以使用chrpath命令(man chrpath)更改“_cairo.cpython-36m-x86_64-linux-gnu.so”库文件中的RPATH,以指向正确的libcairo.so.2所在的文件夹。正确的文件夹指的是带有cairo_tee_surface_index符号的库构建。
1.构建你自己的cairo库(与你的conda '$ conda list cairo'中的版本相同)并将其复制到~/anaconda 3/lib/libcairo.so.2.{additional_version_characters}上。
您系统的libcairo在哪里?
/sbin/ldconfig -p | grep libcairo
nzrxty8p3#
对我来说,
ldd/用户名/lib64/python3.6/站点-软件包/cairo/_ cairo. cpython-36m-x86_64-Linux-gnu.so
显示:文件库地址=〉/usr/local/lib/文件库地址
我有一个陈旧的自编译cairo安装。如果你仍然有原来的编译树,你可以在其中运行
make uninstall
。否则,简单地手动移动/usr/local/lib中的有问题的cairo文件到另一个位置,并删除一旦你确定这些文件是不必要的。hgb9j2n64#
我发现根本错误是找不到
py3cairo.h
只有
locate py3cairo.h
和ln -s /usr/include/pycairo/py3cairo.h /usr/include/py3cairo.h
则编译工作无误。
rdlzhqv95#
这与 Juraj Michalak 的1号溶液相同,
conda
:undefined symbol: cairo_tee_surface_index
,详细流程。我在
cairo
(1.14.12)中有cairo_tee_surface_index
符号,但在它使用的libcairo
中没有:我的系统1正常(1.14.8-1):
因此,我尝试将
conda
环境下的cairo
降级到我的系统版本(从conda repo here版本1.14.8下载),以便用缺少符号的系统库替换默认库:然后又说:
完全符合预期。现在我用系统一替换它:
现在,
import cairo
工作了!5fjcxozz6#
我在安装PyGObject时遇到了类似的问题。
下面的步骤对我很有效。首先确保你没有使用conda,因为它的路径是不同的。然后,
安装这些依赖项
也普遍更新pip。
wh6knrhe7#
看起来像是被pycairo1.23弄坏了
请安装pycairo 1.22
ipakzgxi8#
我刚换了老版本的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
我不太了解它的内部,我只是用蛮力得到一个解决方案。希望它能帮助。
irlmq6kh9#
只要使用这个命令安装你的pycairo,它就能正常工作,运行正常。不需要做任何事情。