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

Skip to content

Commit 017aeed

Browse files
committed
Make sure only one cairo binding is ever used; fix docs.
1 parent 28f05b1 commit 017aeed

File tree

3 files changed

+24
-21
lines changed

3 files changed

+24
-21
lines changed

lib/matplotlib/backends/backend_cairo.py

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

2020
import numpy as np
2121

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

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

lib/matplotlib/backends/backend_qt5cairo.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import cairocffi as cairo
2-
3-
from .backend_cairo import RendererCairo
1+
# Reimport cairo from backend_cairo, so that we use the same binding.
2+
from .backend_cairo import cairo, RendererCairo
43
from .backend_qt5 import QtCore, QtGui, _BackendQT5, FigureCanvasQT
54
from .qt_compat import QT_API
65

tutorials/01_introductory/usage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ def my_plotter(ax, data1, data2, param_dict):
430430
# ``PySide``)
431431
# Qt5Agg Agg rendering in a :term:`Qt5` canvas (requires PyQt5_)
432432
# Qt5Cairo Cairo rendering in a :term:`Qt5` canvas (requires PyQt5_ and
433-
# cairocffi_)
433+
# pycairo_ or cairocffi_)
434434
# WxAgg Agg rendering to to a :term:`wxWidgets` canvas (requires wxPython_)
435435
# macosx Cocoa rendering in OSX windows
436436
# (presently lacks blocking show() behavior when matplotlib is in

0 commit comments

Comments
 (0)