Skip to content

Commit 3ecf087

Browse files
committed
Fix AttributeError: module 'gi' has no attribute 'require_version'
On Arch Linux, automatic backend selection fails when [`at-spi2-core`](https://archlinux.org/packages/extra/x86_64/at-spi2-core/files/) is installed but [`python-gobject`](https://archlinux.org/packages/extra/x86_64/python-gobject/files/) is not. Detect this by importign `gi.require_version` directly. ```python >>> import matplotlib.pyplot as plt >>> plt.plot([0, 1], [0, 1]) Traceback (most recent call last): File "<python-input-1>", line 1, in <module> plt.plot([0, 1], [0, 1]) ~~~~~~~~^^^^^^^^^^^^^^^^ File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 3838, in plot return gca().plot( ~~~^^ File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 2785, in gca return gcf().gca() ~~~^^ File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 1108, in gcf return figure() File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 1042, in figure manager = new_figure_manager( num, figsize=figsize, dpi=dpi, facecolor=facecolor, edgecolor=edgecolor, frameon=frameon, FigureClass=FigureClass, **kwargs) File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 551, in new_figure_manager _warn_if_gui_out_of_main_thread() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 528, in _warn_if_gui_out_of_main_thread canvas_class = cast(type[FigureCanvasBase], _get_backend_mod().FigureCanvas) ~~~~~~~~~~~~~~~~^^ File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 369, in _get_backend_mod switch_backend(rcParams._get("backend")) ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 411, in switch_backend switch_backend(candidate) ~~~~~~~~~~~~~~^^^^^^^^^^^ File "/usr/lib/python3.13/site-packages/matplotlib/pyplot.py", line 425, in switch_backend module = backend_registry.load_backend_module(newbackend) File "/usr/lib/python3.13/site-packages/matplotlib/backends/registry.py", line 317, in load_backend_module return importlib.import_module(module_name) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ File "/usr/lib/python3.13/importlib/__init__.py", line 88, in import_module return _bootstrap._gcd_import(name[level:], package, level) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 1387, in _gcd_import File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 935, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 1026, in exec_module File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed File "/usr/lib/python3.13/site-packages/matplotlib/backends/backend_gtk4agg.py", line 4, in <module> from . import backend_agg, backend_gtk4 File "/usr/lib/python3.13/site-packages/matplotlib/backends/backend_gtk4.py", line 19, in <module> gi.require_version("Gtk", "4.0") ^^^^^^^^^^^^^^^^^^ AttributeError: module 'gi' has no attribute 'require_version' ``` Fixes matplotlib#30654.
1 parent 9b61b47 commit 3ecf087

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

lib/matplotlib/backends/backend_gtk3.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@
1010
CloseEvent, KeyEvent, LocationEvent, MouseEvent, ResizeEvent)
1111

1212
try:
13-
import gi
13+
from gi import require_version as gi_require_version
1414
except ImportError as err:
1515
raise ImportError("The GTK3 backends require PyGObject") from err
1616

1717
try:
1818
# :raises ValueError: If module/version is already loaded, already
1919
# required, or unavailable.
20-
gi.require_version("Gtk", "3.0")
20+
gi_require_version("Gtk", "3.0")
2121
# Also require GioUnix to avoid PyGIWarning when Gio is imported
2222
# GioUnix is platform-specific and may not be available on all systems
2323
try:
24-
gi.require_version("GioUnix", "2.0")
24+
gi_require_version("GioUnix", "2.0")
2525
except ValueError:
2626
# GioUnix is not available on this platform, which is fine
2727
pass

lib/matplotlib/backends/backend_gtk4.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@
99
KeyEvent, LocationEvent, MouseEvent, ResizeEvent, CloseEvent)
1010

1111
try:
12-
import gi
12+
from gi import require_version as gi_require_version
1313
except ImportError as err:
1414
raise ImportError("The GTK4 backends require PyGObject") from err
1515

1616
try:
1717
# :raises ValueError: If module/version is already loaded, already
1818
# required, or unavailable.
19-
gi.require_version("Gtk", "4.0")
19+
gi_require_version("Gtk", "4.0")
2020
# Also require GioUnix to avoid PyGIWarning when Gio is imported
2121
# GioUnix is platform-specific and may not be available on all systems
2222
try:
23-
gi.require_version("GioUnix", "2.0")
23+
gi_require_version("GioUnix", "2.0")
2424
except ValueError:
2525
# GioUnix is not available on this platform, which is fine
2626
pass
@@ -29,6 +29,7 @@
2929
# auto-backend selection logic correctly skips.
3030
raise ImportError(e) from e
3131

32+
import gi
3233
from gi.repository import Gio, GLib, Gtk, Gdk, GdkPixbuf
3334
from . import _backend_gtk
3435
from ._backend_gtk import ( # noqa: F401 # pylint: disable=W0611

0 commit comments

Comments
 (0)