@@ -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 ()
287295def _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
0 commit comments