python - 如何从子进程中运行的ghostscript命令中捕获错误

Posted

技术标签:

【中文标题】python - 如何从子进程中运行的ghostscript命令中捕获错误【英文标题】:python - how to capture errors from a ghostscript command run in a subprocess 【发布时间】:2012-09-04 20:35:35 【问题描述】:

我在一个子进程中运行 ghostscript,它运行良好,但我似乎无法捕获错误。

import subprocess

cmd = 'gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=jpeg -sOutputFile=img-%d.jpeg -r150 -g600x600 sample.pdf'
p = subprocess.Popen(cmd.split(), shell=False, stderr=subprocess.PIPE)

stderr = p.communicate()

print stderr

我的问题是命令是否正确执行,stderr 总是等于:

(无,'')

我再次尝试指定 stdout 和 stderr

p = subprocess.Popen(slide_cmd.split(), shell=False, stdin=PIPE, stdout=PIPE, stderr=STDOUT)

p.stdout 提供输出,但 p.stderr 仍然返回 None

【问题讨论】:

你确定有任何输出到 stderr 吗? None是正常的,你没有stdout=subprocess.PIPE,但是stderr呢? 我已经更新了我的问题以包括标准输出和标准错误 【参考方案1】:

Ghostscript 似乎主要写入 STDOUT,除了像这样的致命错误的摘要

GPL Ghostscript 8.71: Unrecoverable error, exit code 1

最终出现在 STDERR 上。因此,同时阅读 STDOUT,您应该能够捕获所有内容。

为了帮助调试,使用 subprocess 打印您在 python 中执行的命令,然后在 shell 中使用 IO 重定向将输出重定向到文件,以便在该流上查看 GS 输出什么。例如:gs [args] 2>stderr.txt 1>stdout.txt

附带说明,您应该使用shlex.split() 而不是str.split() 来标记参数列表,请参阅此note in the subprocess docs。

在第二个站点注释:一旦您开始使用字符串格式 (cmd % filename) 将“sample.pdf”替换为实际文件名,请确保您转义该 %d(因为它应该由 GS 解释,而不是Python) 改为使用%%d

【讨论】:

顺便感谢 shlex.split() 信息。当有人提供您意想不到的额外价值时,它总是很好 @Finglish 不客气。编辑了我的问题并添加了一个指针;)

以上是关于python - 如何从子进程中运行的ghostscript命令中捕获错误的主要内容,如果未能解决你的问题,请参考以下文章

python multiprocessing:如何从子进程修改在主进程中创建的字典?

如何从子进程中获取环境?

从子进程调用的外部 python 脚本打印 tqdm 进度条

如何从子进程中的致命错误中拯救父进程

如何从子进程设置父进程的外壳环境

如何将值从子脚本传递给同时运行的父脚本?