如何使用f2py在Python中读取Fortran生成的大端格式二进制文件
f2py调用Fortran库读取大端未格式化文件的解决方案
问题原因
gfortran的-fconvert=big-endian参数仅会为编译生成的主程序设置默认的未格式化IO字节序,f2py编译输出的是动态链接库,被Python作为调用方加载时,不会继承该编译期的全局默认设置,因此该参数无法生效,导致字节序不匹配读取到错误数值。
解决方案
方案1(最推荐):修改Fortran代码显式指定字节序
直接在open语句中新增convert='BIG_ENDIAN'参数,针对单个文件指定字节序规则,不受编译参数和运行环境影响,可靠性最高。
修改后的测试模块代码如下:
module test implicit none contains subroutine openFile(fileName) character(len=*), intent(in) :: fileName real(kind=4), allocatable :: array(:,:) print*,"open File:", trim(fileName) ! 新增convert参数指定大端字节序 open(unit=100,file=trim(fileName),form='unformatted',convert='BIG_ENDIAN') allocate(array(2,2)) read(100)array print*,array end subroutine openFile end module test
修改后使用原f2py命令重新编译即可,运行后会正确输出4个10.0的结果。
方案2:运行时设置gfortran IO环境变量
如果不想修改Fortran源码,可以在运行Python脚本前设置gfortran的运行时环境变量指定字节序:
- 针对你使用的单元号100指定字节序:
export GFC_CONVERT_100=BIG_ENDIAN
- 如需全局默认所有未格式化IO都使用大端,可设置:
export GFC_CONVERT_DEFAULT=BIG_ENDIAN
设置完成后再运行Python脚本即可正常读取。
补充注意:你提供的Python测试代码存在两处笔误:子例程名为
openFile而非open,文件名需要用字符串包裹,正确写法为:from test import test as t t.openFile('fileTeste.bin')
内容的提问来源于stack exchange,提问作者João Gerd Zell de Mattos
相关产品推荐
相关产品推荐

