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:如何从子进程修改在主进程中创建的字典?