У меня есть модуль f2py, который я использую. Ядро кода я не писал сам, просто обертка f2py для его использования. Из-за нехватки времени и знания того, что его код является краткосрочным, это означает, что я хочу выбросить его, а не исправить, что я хочу сделать, так это просто поймать поведение, когда происходит segfault, и повторить попытку. Код ниже является примером:
sums.f90
subroutine bad(a, b, c)
real, intent(in) :: a, b
real, intent(out) :: c
real, allocatable :: d(:)
real :: r
call random_number(r)
if (r < 0.5) then
print *, d(1) ! segfault here
end if
c = a + b
end subroutine bad
скомпилировать с: f2py -c sums.f90 -m sums
и теперь, если я просто вызываю его несколько раз, то иногда он работает, а иногда нет.
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
Segmentation fault: 11
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
Segmentation fault: 11
Теперь я знаю, что правильно было бы исправить segfault..., но я надеюсь, что есть способ, которым я могу просто справиться с этим и двигаться дальше из вызывающего кода Python. Это возможно?
--ТЕКУЩИЙ ПОДХОД-- Мое текущее решение состоит в том, чтобы запустить мою программу внутри подпроцесса, используя subprocess.run
, и если код возврата указывает на segfault, попробуйте еще раз определенное количество раз, прежде чем сдаться. Я собираюсь оставить вопрос без ответа, поскольку это не совсем то, что я задавал изначально, а также, вероятно, не рекомендуемая практика, а просто то, что помогает мне справиться с моей текущей ситуацией.