Мне нужно прочитать на Python файл, написанный на Фортране. Для этого я использую f2py из numpy. По сути, я пишу файл parse.f90:
Код: Выделить всё
subroutine read_params(filename, params)
implicit none
! Argument Declarations !
character(len=*), intent(in) :: filename
integer, dimension(4), intent(out) :: params
! Variable Declarations
integer :: i
open (unit=1,status="unknown",file=filename,form="unformatted")
rewind 1
read(1) (params(i), i=1, 4)
end subroutine read_params
Затем я компилирую его с помощью
И теперь я могу импортировать его в свой скрипт Python:
Код: Выделить всё
from pathlib import Path
import numpy as np
from .parse import read_params
def do_stuff_with_params(path: Path):
params = read_params(path)
# do something with the parameters
return
Моя проблема заключается в том, что иногда файл Fortran может не существовать, например, потому, что пользователь do_stuff_with_params передал ему неправильный путь. Однако, поскольку путь не является файловым объектом Python, обычный прием с open неприменим. До сих пор я использовал следующий обходной путь:
Код: Выделить всё
def do_stuff_with_params(path: Path):
if not path.exists():
raise FileNotFoundError(f'{path} does not exist ')
params = read_params(path)
# do something with the parameters
return
Но это не идеально по обычным причинам (файл может быть перемещен или удален между проверкой if и моментом его фактического открытия). Кроме того, мне действительно нужно прочитать файл дважды из-за ограничений Фортрана (длинная история...), поэтому мне придется добавить два оператора if. Как я могу это решить? Мне было интересно, могу ли я вызвать исключение в parse.f90 и передать его интерпретатору Python, но я не знаю, как это сделать.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... ith-python