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.h
和 ln -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的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 2.7 中出现“ImportError:无法导入名称 HTTPSConnection”错误
出现错误:DLL 加载失败:操作系统无法运行 %1 - Python 2.7;报废模块;导入密码学
使用 python 2.7 导入 hashlib 而不是 2.6 时出错