我需要用 Python 读取用 Fortran 编写的文件。为此,我使用
numpy
的 f2py
。基本上,我写了一个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 -m numpy.f2py -c -m parse parse.f90
现在我可以将它导入到我的 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
的用户传递了错误的 path
。然而,由于 path 不是 Python 文件对象,因此通常的 with 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
检查和实际打开之间移动或删除)。另外,由于 Fortran 的限制(长话短说……),我实际上需要读取该文件两次,因此我必须添加两个 if
语句。我该如何解决这个问题?我想知道是否可以在 parse.f90
中引发异常并将其传递给 Python 解释器,但我不知道该怎么做。
Fortran 中不存在异常,因此没有异常处理。但是外部文件处理语句现在可以采用可选的 iostat 和 iomsg 子句。
iostat 是一个整数,如果出现错误,则返回非零值,但执行不会停止。
您可以添加它们在 Fortran 中公开代码:
integer :: my_iostat
character (256) :: my_iomsg
open (unit=1,status="unknown",file=filename,form="unformatted",iostat=my_iostat, iomsg=my_iomsg)
if (my_iostat/=0) then
! put some values in params that you could use to identify the error in Python
else
! read the file
end if