Ubuntu 22.04下Matplotlib使用GTK4Agg后端报错缺失gi._gi_cairo模块的解决咨询
Ubuntu 22.04下Matplotlib使用GTK4Agg后端报错缺失gi._gi_cairo模块的解决咨询
我在Ubuntu 22.04上运行以下极简测试代码时,遇到了Matplotlib GTK4Agg后端的报错:
import matplotlib as mpl from matplotlib import pyplot as plt mpl.use("GTK4Agg")
完整报错回溯信息如下:
niko@niko-ubuntu:~/myproj$ python script.py Traceback (most recent call last): File "/usr/lib/python3/dist-packages/gi/__init__.py", line 176, in require_foreign _gi.require_foreign(namespace, symbol) ModuleNotFoundError: No module named 'gi._gi_cairo' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/niko/.local/lib/python3.10/site-packages/matplotlib/backends/_backend_gtk.py", line 23, in <module> gi.require_foreign("cairo") File "/usr/lib/python3/dist-packages/gi/__init__.py", line 178, in require_foreign raise ImportError(str(e)) ImportError: No module named 'gi._gi_cairo' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/niko/myproj/script.py", line 4, in <module> mpl.use("GTK4Agg") File "/home/niko/.local/lib/python3.10/site-packages/matplotlib/__init__.py", line 1233, in use plt.switch_backend(name) File "/home/niko/.local/lib/python3.10/site-packages/matplotlib/pyplot.py", line 271, in switch_backend backend_mod = importlib.import_module( File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/home/niko/.local/lib/python3.10/site-packages/matplotlib/backends/backend_gtk4agg.py", line 4, in <module> from . import backend_agg, backend_gtk4 File "/home/niko/.local/lib/python3.10/site-packages/matplotlib/backends/backend_gtk4.py", line 26, in <module> from . import _backend_gtk File "/home/niko/.local/lib/python3.10/site-packages/matplotlib/backends/_backend_gtk.py", line 25, in <module> raise ImportError("Gtk-based backends require cairo") from e ImportError: Gtk-based backends require cairo
已做的排查步骤
- 首先根据报错最后一行提示,尝试安装pycairo,但系统提示已经安装:
niko@niko-ubuntu:~/myproj$ python -m pip install pycairo Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: pycairo in /usr/lib/python3/dist-packages (1.20.1)
- 验证cairo可以正常导入:
niko@niko-ubuntu:~/myproj$ ipython >>> import cairo >>> cairo.__file__ '/usr/lib/python3/dist-packages/cairo/__init__.py'
- 进一步查看完整报错后,测试
gi.require_foreign("cairo"),同样触发缺失gi._gi_cairo的报错:
>>> import gi >>> gi.require_foreign("cairo") --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) File /usr/lib/python3/dist-packages/gi/__init__.py:176, in require_foreign(namespace, symbol) 175 try: --> 176 _gi.require_foreign(namespace, symbol) 177 except Exception as e: ModuleNotFoundError: No module named 'gi._gi_cairo' During handling of the above exception, another exception occurred: ImportError Traceback (most recent call last) Cell In[4], line 1 ----> 1 gi.require_foreign("cairo") File /usr/lib/python3/dist-packages/gi/__init__.py:178, in require_foreign(namespace, symbol) 176 _gi.require_foreign(namespace, symbol) 177 except Exception as e: --> 178 raise ImportError(str(e)) 179 importlib.import_module('gi.repository', namespace) ImportError: No module named 'gi._gi_cairo'
核心疑问
根据Matplotlib文档说明,GTK4Agg后端只需要PyGObject和pycairo,我已经可以正常导入gi和pycairo,但为什么还是会出现gi._gi_cairo模块缺失的问题?应该安装什么包来解决这个问题?
备注:内容来源于stack exchange,提问作者Niko Fohr
相关产品推荐
相关产品推荐

