通过子进程调用时,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
。
我自己的尝试是:
- 为方便起见,我在整个基本目录+所有文件上使用了
chmod 777
,因此我确信这不是版权问题。
- 因为我知道有时需要使用子进程调用中使用的任何命令的完整路径,所以我也尝试了很多变体,从我在终端中使用的简单
"gs"
到完整的"/usr/zsh", "/usr/local/bin/gs"
在子流程调用中但无济于事。
- 我对整体语法进行了三重检查(是的,我还尝试将整个命令包装在一个变量中并使用 shlex.split(command) 来双重确定我的语法,所以我很确定这不是语法问题。
感谢任何帮助!
您明确地将引号添加到路径中,因此 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
情况会有所不同
我有一个损坏的 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
。
我自己的尝试是:
- 为方便起见,我在整个基本目录+所有文件上使用了
chmod 777
,因此我确信这不是版权问题。 - 因为我知道有时需要使用子进程调用中使用的任何命令的完整路径,所以我也尝试了很多变体,从我在终端中使用的简单
"gs"
到完整的"/usr/zsh", "/usr/local/bin/gs"
在子流程调用中但无济于事。 - 我对整体语法进行了三重检查(是的,我还尝试将整个命令包装在一个变量中并使用 shlex.split(command) 来双重确定我的语法,所以我很确定这不是语法问题。
感谢任何帮助!
您明确地将引号添加到路径中,因此 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
情况会有所不同