我的应用程序依靠ghostscript
来将一些pdf文件转换为文档每一页的一系列图像。这是一个简化的版本:
import locale
from ghostscript import Ghostscript as gs
from ghostscript import cleanup
from cv2 import imread, IMREAD_GRAYSCALE as GRAY
from multiprocessing import cpu_count
args = [
"",
"-q", "-r300", "-dNOPAUSE",
"-sDEVICE=pgmraw",
"-sOutputFile=%d.pgm",
"-dNumRenderingThreads=" + str(cpu_count()),
"-f", "_.pdf" #filename will always be "_.pdf"
]
encoding = locale.getpreferredencoding()
args = [a.encode(encoding) for a in args]
def pdftoimarray():
cleanup()
gs(*args)
imarray = []
for filename in os.listdir():
imarray.append(imread(filename, GRAY))
return imarray
(我最后有意删除了文件系统的清理:这个问题并不重要)
问题是,我真的不相信这些文件的来源,其中一些可能有问题。运行一些测试,我发现其中一些不良文档实际上导致了ghostscript segfault的出现,从而使整个应用程序崩溃。
通常,segfault是一个非常严重的事件,我们无法真正从中恢复,因此,我怀疑是否确实有可能捕获它。但是以我为例,它并没有那么严重:假设我的程序仍然处于有效状态,我可以将该文档标记为 bad 并继续。
问题:我可以以某种方式将分段错误捕获到我的依赖项中并从中恢复吗?
以前在Segmentation Fault Catch中曾对此提出过一些疑问,但是唯一的答案是错误的(它建议将其捕获在signal.signal
中,但是documentation明确指出捕获诸如SIGSEGV之类的同步信号使用它毫无意义。相同的文档指向faulthandler,但它并不能真正捕获信号:它可以提供更好的错误消息,以防万一。)
剩下的问题是这个问题如何唯一,而不是重复:我的限制有所减少:我根本不想处理这个问题:我只是想忽略它,继续前进。首先避免真正在ghostscript中出现段错误的任何观点也将受到欢迎。