From e51e21c6b6422fdf96287d296f1f1bae5efe7a96 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 25 Nov 2019 12:54:55 -0800 Subject: [PATCH] ghostscript: Refactor checking for executable name on Windows --- src/ocrmypdf/exec/ghostscript.py | 12 +++++----- tests/spoof/gs.py | 40 +++++++++++++++++++++++++++++++ tests/spoof/gs_feature_elision.py | 5 +--- tests/spoof/gs_pdfa_failure.py | 6 +---- tests/spoof/gs_raster_failure.py | 5 +--- tests/spoof/gs_render_failure.py | 5 +--- 6 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 tests/spoof/gs.py diff --git a/src/ocrmypdf/exec/ghostscript.py b/src/ocrmypdf/exec/ghostscript.py index 4ce625fd..434859ad 100644 --- a/src/ocrmypdf/exec/ghostscript.py +++ b/src/ocrmypdf/exec/ghostscript.py @@ -27,6 +27,7 @@ from io import BytesIO from os import fspath from pathlib import Path from subprocess import PIPE, run, CalledProcessError +from shutil import which from PIL import Image @@ -37,12 +38,11 @@ gslog = logging.getLogger() GS = 'gs' if os.name == 'nt': - GS = 'gswin64c' - try: - get_version(GS) - except MissingDependencyError: - GS = 'gswin32c' - get_version(GS) + GS = which('gswin64c') + if not GS: + GS = which('gswin32c') + if not GS: + raise MissingDependencyError("Ghostscript (gswin64c or gswin32c)") @lru_cache(maxsize=1) diff --git a/tests/spoof/gs.py b/tests/spoof/gs.py new file mode 100644 index 00000000..978f346b --- /dev/null +++ b/tests/spoof/gs.py @@ -0,0 +1,40 @@ +# © 2019 James R. Barlow: github.com/jbarlow83 +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +"""Find Ghostscript executable""" + + +import os +import shutil + + +def real_ghostscript(argv): + if os.name != 'nt': + gs = shutil.which('gs') + gs_args = [gs] + argv[1:] + os.execv(gs_args[0], gs_args) + else: + gs = shutil.which('gswin64c') + if not gs: + gs = shutil.which('gswin32c') + os.execv(gs, argv[1:]) + + return # Not reachable diff --git a/tests/spoof/gs_feature_elision.py b/tests/spoof/gs_feature_elision.py index ad65a619..0ae46b46 100755 --- a/tests/spoof/gs_feature_elision.py +++ b/tests/spoof/gs_feature_elision.py @@ -30,10 +30,7 @@ from subprocess import check_call PDF/A creation.""" -def real_ghostscript(argv): - gs_args = ['gs'] + argv[1:] - os.execvp("gs", gs_args) - return # Not reachable +from gs import real_ghostscript elision_warning = """GPL Ghostscript 9.20: Setting Overprint Mode to 1 diff --git a/tests/spoof/gs_pdfa_failure.py b/tests/spoof/gs_pdfa_failure.py index 730fa5b5..b8559192 100755 --- a/tests/spoof/gs_pdfa_failure.py +++ b/tests/spoof/gs_pdfa_failure.py @@ -27,11 +27,7 @@ import sys """Replicate Ghostscript PDF/A conversion failure by suppressing some arguments""" - -def real_ghostscript(argv): - gs_args = ['gs'] + argv[1:] - os.execvp("gs", gs_args) - return # Not reachable +from gs import real_ghostscript def main(): diff --git a/tests/spoof/gs_raster_failure.py b/tests/spoof/gs_raster_failure.py index b404cca8..f7269b3f 100755 --- a/tests/spoof/gs_raster_failure.py +++ b/tests/spoof/gs_raster_failure.py @@ -27,10 +27,7 @@ import sys """Replicate Ghostscript raster failure while allowing rendering""" -def real_ghostscript(argv): - gs_args = ['gs'] + argv[1:] - os.execvp("gs", gs_args) - return # Not reachable +from gs import real_ghostscript def main(): diff --git a/tests/spoof/gs_render_failure.py b/tests/spoof/gs_render_failure.py index 3027a684..5bb6ce7c 100755 --- a/tests/spoof/gs_render_failure.py +++ b/tests/spoof/gs_render_failure.py @@ -26,10 +26,7 @@ import os import sys -def real_ghostscript(argv): - gs_args = ['gs'] + argv[1:] - os.execvp("gs", gs_args) - return # Not reachable +from gs import real_ghostscript def main():