用Python读取Fortran文件时如何安全地检查它是否存在?

问题描述 投票:0回答:1

我需要用 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 解释器,但我不知道该怎么做。

python io fortran f2py
1个回答
0
投票

Fortran 中不存在异常,因此没有异常处理。但是外部文件处理语句现在可以采用可选的 iostatiomsg 子句。
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


在Python代码中,您必须检查返回值是否与您定义的错误匹配,否则文件读取没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.