f2py不喜欢子程序中的显式形状数组

时间:2012-11-22 15:05:30

标签: python numpy fortran f2py

我正在尝试使用f2py从一些Fortran代码编译python模块。使用ifort编译代码很好,但在使用f2py时会抛出错误。这是代码(它是两个文件):

gdat.f90:

  MODULE GDAT
  PUBLIC

  INTEGER :: NX, NY

  END MODULE GDAT

part.f90:

  SUBROUTINE PART(ARR)

  USE GDAT, ONLY: NX, NY
  INTEGER, INTENT(IN) :: ARR(NX,NY)
  PRINT*, ARR

  END SUBROUTINE PART

我使用f2py -c gdat.f90 part.f90 -m part编译它,但是我得到关于nx和ny没有被定义的错误,例如:     /var/tmp/tmp2hzU6s/src.linux-x86_64-2.7/untitledmodule.c:在函数'f2py_rout_untitled_pa​​rt'中:     /var/tmp/tmp2hzU6s/src.linux-x86_64-2.7/untitledmodule.c:180:错误:'nx'未声明(首次在此函数中使用)

明确形状的数组ARR的定义似乎存在问题。就像我说的,它在ifort上编译得很好。

我知道这是一段简单的代码,可以用另一种方式编写,但它只是我写的一个测试文件:我实际上是在尝试编译一大堆具有大量这些显式数组的fortran模块(使用来自中央模块的变量来定义边界)中的定义,所以我真的想让它工作而不是重写其他代码!

2 个答案:

答案 0 :(得分:1)

据我所知,你遇到的问题是,数组的大小必须是ALLOCATABLE动态的,或者已经用数值常量或参数修正。

在您的情况下,变量nxny既不设置也不参数。如果你想将你的两个文件分别编译成模块(ifort而不是f2py),它也应该抱怨。

答案 1 :(得分:0)

尝试通过

创建签名文件
f2py -m pythmod -h signature.pyf gdat.f90 part.f90

然后将其与

一起使用
f2py -c signature.pyf gdat.f90 part.f90 .

这将创建文件 pythmod.so