我的应用程序依赖于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实际上出现段错误,从而使我的整个应用程序崩溃。
通常,段错误是一个非常严重的事件,我们无法真正从中恢复,所以我怀疑是否真的有可能捕获它。但在我的情况下,它不应该真的那么严重:假设我的程序仍处于有效状态,我可以只将那个文档标记为坏并继续进行。
问题:我是否可以在依赖项中捕获此段错误,并从中恢复?
这在Segmentation Fault Catch中已经被问过了,但唯一的答案是错误的(它建议使用signal.signal
来捕获它,但文档明确指出,使用它捕获同步信号(如SIGSEGV)没有多大意义。同样的文档指向faulthandler,但它不能真正捕获信号:如果它发生,它只提供更好的错误消息)。
这就留下了一个问题,即这个问题独特在哪里,而不是一个重复的问题:我受限制较少:我根本不打算解决这个问题:我只想忽略它并继续进行。任何有关实际避免ghostscript中的段错误的提示也将非常受欢迎。
这个问题有点老了,但我认为我应该分享一下:我正在观看有关一个很酷的新的内存分配器的视频,在听众提出的一个问题中,作者解释说他“安装了一个段错误处理程序”,这正是我感兴趣的内容。我仍然不知道他到底是如何做到的,所以这并没有完全回答我的问题,但它为我开始研究提供了一个好的起点。如果我成功地解决了这个问题,我会在这里发布一个答案。
以下是视频链接(链接指向我提到的问题的时间):https://youtu.be/c1UBJbfR-H0?t=2058
faulthandler
这样的库在接收到信号后能够实际执行一些操作然后退出的原因)。我的假设错了吗? - Cássio Renan