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

Skip to content

Commit 64ba969

Browse files
authored
Make ExecutableUnavailableError (#14776)
Make ExecutableUnavailableError
2 parents d1941a7 + 8c31af8 commit 64ba969

File tree

5 files changed

+31
-19
lines changed

5 files changed

+31
-19
lines changed

lib/matplotlib/__init__.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,14 @@ def wrapper():
283283
_ExecInfo = namedtuple("_ExecInfo", "executable version")
284284

285285

286+
class ExecutableNotFoundError(FileNotFoundError):
287+
"""
288+
Error raised when an executable that Matplotlib optionally
289+
depends on can't be found.
290+
"""
291+
pass
292+
293+
286294
@functools.lru_cache()
287295
def _get_executable_info(name):
288296
"""
@@ -307,7 +315,7 @@ def _get_executable_info(name):
307315
308316
Raises
309317
------
310-
FileNotFoundError
318+
ExecutableNotFoundError
311319
If the executable is not found or older than the oldest version
312320
supported by Matplotlib.
313321
ValueError
@@ -319,25 +327,27 @@ def impl(args, regex, min_ver=None, ignore_exit_code=False):
319327
# Search for a regex match in the output; if the match succeeds, the
320328
# first group of the match is the version.
321329
# Return an _ExecInfo if the executable exists, and has a version of
322-
# at least min_ver (if set); else, raise FileNotFoundError.
330+
# at least min_ver (if set); else, raise ExecutableNotFoundError.
323331
try:
324332
output = subprocess.check_output(
325333
args, stderr=subprocess.STDOUT, universal_newlines=True)
326334
except subprocess.CalledProcessError as _cpe:
327335
if ignore_exit_code:
328336
output = _cpe.output
329337
else:
330-
raise _cpe
338+
raise ExecutableNotFoundError(str(_cpe)) from _cpe
339+
except FileNotFoundError as _fnf:
340+
raise ExecutableNotFoundError(str(_fnf)) from _fnf
331341
match = re.search(regex, output)
332342
if match:
333343
version = LooseVersion(match.group(1))
334344
if min_ver is not None and version < min_ver:
335-
raise FileNotFoundError(
345+
raise ExecutableNotFoundError(
336346
f"You have {args[0]} version {version} but the minimum "
337347
f"version supported by Matplotlib is {min_ver}.")
338348
return _ExecInfo(args[0], version)
339349
else:
340-
raise FileNotFoundError(
350+
raise ExecutableNotFoundError(
341351
f"Failed to determine the version of {args[0]} from "
342352
f"{' '.join(args)}, which output {output}")
343353

@@ -350,9 +360,10 @@ def impl(args, regex, min_ver=None, ignore_exit_code=False):
350360
for e in execs:
351361
try:
352362
return impl([e, "--version"], "(.*)", "9")
353-
except FileNotFoundError:
363+
except ExecutableNotFoundError:
354364
pass
355-
raise FileNotFoundError("Failed to find a Ghostscript installation")
365+
message = "Failed to find a Ghostscript installation"
366+
raise ExecutableNotFoundError(message)
356367
elif name == "inkscape":
357368
return impl(["inkscape", "-V"], "^Inkscape ([^ ]*)")
358369
elif name == "magick":
@@ -380,7 +391,7 @@ def impl(args, regex, min_ver=None, ignore_exit_code=False):
380391
else:
381392
path = "convert"
382393
if path is None:
383-
raise FileNotFoundError(
394+
raise ExecutableNotFoundError(
384395
"Failed to find an ImageMagick installation")
385396
return impl([path, "--version"], r"^Version: ImageMagick (\S*)")
386397
elif name == "pdftops":
@@ -389,7 +400,7 @@ def impl(args, regex, min_ver=None, ignore_exit_code=False):
389400
if info and not ("3.0" <= info.version
390401
# poppler version numbers.
391402
or "0.9" <= info.version <= "1.0"):
392-
raise FileNotFoundError(
403+
raise ExecutableNotFoundError(
393404
f"You have pdftops version {info.version} but the minimum "
394405
f"version supported by Matplotlib is 3.0.")
395406
return info
@@ -478,14 +489,14 @@ def checkdep_ps_distiller(s):
478489
return False
479490
try:
480491
_get_executable_info("gs")
481-
except FileNotFoundError:
492+
except ExecutableNotFoundError:
482493
_log.warning(
483494
"Setting rcParams['ps.usedistiller'] requires ghostscript.")
484495
return False
485496
if s == "xpdf":
486497
try:
487498
_get_executable_info("pdftops")
488-
except FileNotFoundError:
499+
except ExecutableNotFoundError:
489500
_log.warning(
490501
"Setting rcParams['ps.usedistiller'] to 'xpdf' requires xpdf.")
491502
return False
@@ -500,12 +511,12 @@ def checkdep_usetex(s):
500511
return False
501512
try:
502513
_get_executable_info("dvipng")
503-
except FileNotFoundError:
514+
except ExecutableNotFoundError:
504515
_log.warning("usetex mode requires dvipng.")
505516
return False
506517
try:
507518
_get_executable_info("gs")
508-
except FileNotFoundError:
519+
except ExecutableNotFoundError:
509520
_log.warning("usetex mode requires ghostscript.")
510521
return False
511522
return True

lib/matplotlib/animation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,8 @@ def bin_path(cls):
725725
def isAvailable(cls):
726726
try:
727727
return super().isAvailable()
728-
except FileNotFoundError: # May be raised by get_executable_info.
728+
except mpl.ExecutableNotFoundError:
729+
# May be raised by get_executable_info.
729730
return False
730731

731732

lib/matplotlib/backends/backend_pgf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def cairo_convert(pdffile, pngfile, dpi):
157157
return cairo_convert
158158
try:
159159
gs_info = mpl._get_executable_info("gs")
160-
except FileNotFoundError:
160+
except mpl.ExecutableNotFoundError:
161161
pass
162162
else:
163163
def gs_convert(pdffile, pngfile, dpi):

lib/matplotlib/rcsetup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,14 +483,14 @@ def validate_ps_distiller(s):
483483
elif s in ('ghostscript', 'xpdf'):
484484
try:
485485
mpl._get_executable_info("gs")
486-
except FileNotFoundError:
486+
except mpl.ExecutableNotFoundError:
487487
_log.warning("Setting rcParams['ps.usedistiller'] requires "
488488
"ghostscript.")
489489
return None
490490
if s == "xpdf":
491491
try:
492492
mpl._get_executable_info("pdftops")
493-
except FileNotFoundError:
493+
except mpl.ExecutableNotFoundError:
494494
_log.warning("Setting rcParams['ps.usedistiller'] to 'xpdf' "
495495
"requires xpdf.")
496496
return None

lib/matplotlib/testing/compare.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,13 +220,13 @@ def __call__(self, orig, dest):
220220
def _update_converter():
221221
try:
222222
mpl._get_executable_info("gs")
223-
except FileNotFoundError:
223+
except mpl.ExecutableNotFoundError:
224224
pass
225225
else:
226226
converter['pdf'] = converter['eps'] = _GSConverter()
227227
try:
228228
mpl._get_executable_info("inkscape")
229-
except FileNotFoundError:
229+
except mpl.ExecutableNotFoundError:
230230
pass
231231
else:
232232
converter['svg'] = _SVGConverter()

0 commit comments

Comments
 (0)