使用numpy.f2py编译Fortran脚本遇ALLOCATABLE参数错误求助
编译命令
我使用以下命令编译Fortran脚本为Python模块:
python -m numpy.f2py -c -m matching_pairs Matching_Pairs_V2.F90 --fcompiler=gnu95 --compiler=mingw32
该命令对另外两个Fortran脚本有效,但针对Matching_Pairs_V2.F90执行时失败。
错误输出
C:\Users\web200\AppData\Local\Temp\tmpst9o9who\src.win-amd64-3.9\matching_pairs-f2pywrappers2.f90:48:64: &, frame_sint_cutoff, lambda_min, s0_vector, motion_angle, mask, se& 1 Error: Actual argument for 'mask' must be ALLOCATABLE at (1)
相关Fortran子例程
定位到引发错误的子例程:
! Filtering of monorays subroutine frame_windows_filtering(mono_rays, mono_rays_len, TransMatrix, frame_sint_cutoff, lambda_min, S0_vector,& motion_angle, mask, selected_transformed_mono_rays) ! Input/Output variables REAL*8, INTENT(IN) :: frame_sint_cutoff, lambda_min REAL*8, DIMENSION(:,:), INTENT(IN) :: mono_rays REAL*8, DIMENSION(:), INTENT(IN) :: mono_rays_len REAL*8, DIMENSION(3,3), INTENT(IN) :: TransMatrix REAL*8, DIMENSION(3), INTENT(IN) :: S0_vector REAL*8, INTENT(IN) :: motion_angle REAL*8, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: selected_transformed_mono_rays LOGICAL,DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: mask ...(省略中间代码) end subroutine frame_windows_filtering
补充信息
简化版测试代码中,subroutine matching_per_frame调用frame_windows_filtering时使用变量frame_mono_rays_mask替代mask,该变量未添加INTENT(OUT)属性,其余声明与mask一致。原代码来自laueutil项目。
解决方法
错误根源是调用frame_windows_filtering的实参未被声明为ALLOCATABLE,即使子例程的形参是可分配的,实参也必须匹配该属性才能正确传递。
修改调用处的变量声明
找到调用frame_windows_filtering的位置(比如matching_per_frame中的frame_mono_rays_mask),将其声明改为:LOGICAL,DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: frame_mono_rays_mask确保该变量的属性与子例程形参
mask完全匹配,子例程会负责分配它的内存。调整参数传递逻辑(可选)
如果不想让子例程分配内存,可以将mask的INTENT改为INOUT,并在调用前手动分配好数组大小。但这需要同步修改子例程内部的逻辑,确保不会重新分配已存在的数组。验证f2py包装器生成
若修改代码后仍有问题,可以先让f2py生成接口文件,检查包装器是否正确识别了可分配参数:python -m numpy.f2py Matching_Pairs_V2.F90 -m matching_pairs -h matching_pairs.pyf查看生成的
.pyf文件中frame_windows_filtering的接口定义,确认mask的属性被正确标记。
内容的提问来源于stack exchange,提问作者Jack Webster

