通过子进程调用时,GhostScript 无法创建输出文件

GhostScript fails to create output file when called via subprocess

我有一个损坏的 PDF,当我通过终端输入此命令时:

gs -o "/Path/to/required/repaired_file.pdf" -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress "/Path/to/required/corrupted_file.pdf"

新的(未损坏的)PDF 文件 (repaired_file.pdf) 已成功创建。但是,当我尝试从 subprocess.call() 或 subprocess.Popen() 中使用 运行 此命令时,命令失败:

Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 19 2015, 20:38:52) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import subprocess
>>> subprocess.call(["/usr/local/bin/gs", "-o", "\"/Path/to/required/repaired_file.pdf\"", "-sDEVICE=pdfwrite", "-dPDFSETTINGS=/prepress", "\"/Path/to/required/corrupted_file.pdf\""], stderr=sys.stdout)
GPL Ghostscript 9.20 (2016-09-26)
Copyright (C) 2016 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GPL Ghostscript 9.20: **** Could not open the file "/Path/to/required/repaired_file.pdf" .
**** Unable to open the initial device, quitting.
1

所需的解决方案:

任何解决方案都很好,但由于已知的安全问题,我不喜欢在我的子流程语句中使用 shell=True

我自己的尝试是:

感谢任何帮助!

您明确地将引号添加到路径中,因此 gs 尝试查找其路径以 " 开头和结尾的文件。毫不奇怪,它找不到它。假设您正在使用 Linux 或其他类 Unix 系统 (*),在命令行中,引号由 shell 处理,并且 gs 使用未加引号的参数调用。

只需使用:

subprocess.call(["/usr/local/bin/gs", "-o", "/Path/to/required/repaired_file.pdf", 
    "-sDEVICE=pdfwrite", "-dPDFSETTINGS=/prepress", "/Path/to/required/corrupted_file.pdf"],
    stderr=sys.stdout)

(*)Windows

情况会有所不同