linux Python:导入cairo错误(Python 2.7 & 3.6)未定义的符号:开罗_三通_曲面_索引

cdmah0mi  于 2023-02-15  发布在  Linux
关注(0)|答案(9)|浏览(182)

当我尝试在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。
编辑:下载了源代码,并做了“使卸载”,然后重新安装它。现在我可以导入开罗没有任何错误。

eagi6jfj

eagi6jfj1#

安装cairrocffi,并将import cairocffi替换为import cairocffi as cairo

mftmpeh8

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

nzrxty8p

nzrxty8p3#

对我来说,
ldd/用户名/lib64/python3.6/站点-软件包/cairo/_ cairo. cpython-36m-x86_64-Linux-gnu.so
显示:文件库地址=〉/usr/local/lib/文件库地址
我有一个陈旧的自编译cairo安装。如果你仍然有原来的编译树,你可以在其中运行make uninstall。否则,简单地手动移动/usr/local/lib中的有问题的cairo文件到另一个位置,并删除一旦你确定这些文件是不必要的。

hgb9j2n6

hgb9j2n64#

我发现根本错误是找不到py3cairo.h
只有locate py3cairo.hln -s /usr/include/pycairo/py3cairo.h /usr/include/py3cairo.h
则编译工作无误。

rdlzhqv9

rdlzhqv95#

这与 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(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正常(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工作了!

5fjcxozz

5fjcxozz6#

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

wh6knrhe7#

看起来像是被pycairo1.23弄坏了
请安装pycairo 1.22

pip3 install pycairo==1.22
ipakzgxi

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
我不太了解它的内部,我只是用蛮力得到一个解决方案。希望它能帮助。

irlmq6kh

irlmq6kh9#

conda install -c conda-forge pycairo

只要使用这个命令安装你的pycairo,它就能正常工作,运行正常。不需要做任何事情。

相关问题