You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:27:02