Мое приложение зависит от 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 и двигаться дальше.
Вопрос : Могу ли я каким-то образом отловить эту ошибку сегментации в моей зависимости и восстановить ее?
Это было несколько ранее задано в Cagmentation Fault Catch , но единственный ответ неверен (предлагается отловить его с помощью signal.signal
, но в документации ясно сказано, что перехват синхронный такие сигналы, как SIGSEGV, не имеют смысла в его использовании. В той же документации указывается обработчик ошибок , но он не может реально перехватить сигнал: он просто выдает лучшие сообщения об ошибках в случае, если это произойдет).
Это оставляет вопрос о том, насколько этот вопрос уникален, а не является его дубликатом: я несколько менее ограничен: я вовсе не собираюсь решать проблему: я просто хочу игнорировать ее и двигаться дальше. Любые пункты о том, как на самом деле избежать сегфоута в ghostscript, также будут очень хорошо приняты.