Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 138ba58

Browse files
committed
Make sure only one cairo binding is ever used; fix docs.
1 parent 2eac3fa commit 138ba58

File tree

2 files changed

+26
-22
lines changed

2 files changed

+26
-22
lines changed

lib/matplotlib/backends/backend_cairo.py

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,30 @@
1818

1919
import numpy as np
2020

21-
try:
22-
import cairocffi as cairo
23-
except ImportError:
21+
# In order to make it possible to pick the binding, use whichever has already
22+
# been imported, if any. (The intermediate call to iter is just to placate
23+
# Python2.)
24+
cairo = next(
25+
(mod for mod in (
26+
sys.modules.get(name) for name in ["cairocffi", "cairo"]) if mod),
27+
None)
28+
if cairo is None:
2429
try:
25-
import cairo
30+
import cairocffi as cairo
2631
except ImportError:
27-
raise ImportError("Cairo backend requires that cairocffi or pycairo "
28-
"is installed.")
29-
else:
30-
HAS_CAIRO_CFFI = False
31-
else:
32-
HAS_CAIRO_CFFI = True
33-
34-
_version_required = (1, 2, 0)
35-
if cairo.version_info < _version_required:
36-
raise ImportError("Pycairo %d.%d.%d is installed\n"
37-
"Pycairo %d.%d.%d or later is required"
38-
% (cairo.version_info + _version_required))
32+
try:
33+
import cairo
34+
except ImportError:
35+
raise ImportError(
36+
"The cairo backend requires cairocffi or pycairo")
37+
# cairocffi can install itself as cairo (`install_as_pycairo`) -- don't get
38+
# fooled!
39+
HAS_CAIRO_CFFI = cairo.__name__ == "cairocffi"
40+
41+
if cairo.version_info < (1, 2, 0):
42+
raise ImportError("cairo {} is installed; "
43+
"cairo>=1.2.0 is required".format(cairo.version))
3944
backend_version = cairo.version
40-
del _version_required
4145

4246
from matplotlib.backend_bases import (
4347
_Backend, FigureCanvasBase, FigureManagerBase, GraphicsContextBase,

tutorials/introductory/usage.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -432,23 +432,23 @@ def my_plotter(ax, data1, data2, param_dict):
432432
# ``%matplotlib notebook``.
433433
# WebAgg On ``show()`` will start a tornado server with an interactive
434434
# figure.
435-
# Qt5Cairo Cairo rendering in a :term:`Qt5` canvas (requires PyQt5_ and
436-
# cairocffi_).
435+
# Qt5Cairo Cairo rendering in a :term:`Qt5` canvas (requires PyQt5_, and
436+
# pycairo_ or cairocffi_).
437437
# GTK3Cairo Cairo rendering to a :term:`GTK` 3.x canvas (requires PyGObject_,
438438
# and pycairo_ or cairocffi_).
439439
# Qt4Agg Agg rendering to a :term:`Qt4` canvas (requires PyQt4_ or
440440
# ``pyside``). This backend can be activated in IPython with
441441
# ``%matplotlib qt4``.
442-
# Qt4Cairo Cairo rendering in a :term:`Qt5` canvas (requires PyQt5_ and
443-
# cairocffi_).
442+
# Qt4Cairo Cairo rendering in a :term:`Qt4` canvas (requires PyQt4_, and
443+
# pycairo_ or cairocffi_).
444444
# GTKAgg Agg rendering to a :term:`GTK` 2.x canvas (requires PyGTK_, and
445445
# pycairo_ or cairocffi_; Python2 only). This backend can be
446446
# activated in IPython with ``%matplotlib gtk``.
447447
# GTKCairo Cairo rendering to a :term:`GTK` 2.x canvas (requires PyGTK_,
448448
# and pycairo_ or cairocffi_; Python2 only).
449449
# WXAgg Agg rendering to a :term:`wxWidgets` canvas (requires wxPython_;
450450
# v4.0 (in beta) is required for Python3). This backend can be
451-
# activated in IPython with ``%matplotlib wx``.
451+
# activated in IPython with ``%matplotlib wx``.#
452452
# ========= ================================================================
453453
#
454454
# .. _`Anti-Grain Geometry`: http://antigrain.com/

0 commit comments

Comments
 (0)