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の本に記載されている順序でモジュールをコンパイルおよびビルドしました。また、本に記載されているように、ティーを有効にしてカイロをインストールしました。
私のシステムはLFSで、カーネルバージョンは4.14.4、Python 2.7.14およびPython 3.6.4)です。
編集:ソースをダウンロードし、「makeuninstall」を実行してから再インストールしました。これで、エラーなしでcairoをインポートできます。
古いバージョンの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
明らかに;よくわかりませんが、ブルートフォースを使って解決しました。それが役に立てば幸い。
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)で必要とされるため、「importcairo」を実行すると失敗します。
次のオプションがあります。
$ strings /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.8 | grep cairo_tee_surface_index
。そのため、コンダのカイロをシステムと同じバージョンにダウングレードしましたconda install cairo=version
そして私のシステムlibcairoを私のcondalibcairoにコピーしました: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
cairocffiをインストールし、import cairocffi
をimport cairocffi as cairo
に置き換えます。
私のために、
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ファイルを手動で別の場所に移動し、ファイルが不要であることが確認できたら削除します。
ルートエラーがpy3cairo.h
を見つけていないことがわかりました
locate py3cairo.h
、およびln -s /usr/include/pycairo/py3cairo.h /usr/include/py3cairo.h
だけ
その後、コンパイルはエラーなしで機能します。
これは、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
シンボルはcairo
(1.14.12)にありますが、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
だから、私が試したのは、cairo
environmentの下のconda
を私のシステムのバージョンにダウングレードすることです(バージョン1.14.8の場合はcondaリポジトリからダウンロード ここ )、デフォルトのlibを、シンボルが欠落しているシステムに置き換えるには、次のようにします。
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
動作します!