包含文件的f2py

时间:2013-02-17 10:42:18

标签: python fortran f2py

我正在编译一个名为prog.f的fortran程序。它包含一个名为test.inc的包含文件。 以下成功运行并显示找到了我的包含文件。我生成了一个prog.so文件。

f2py -c prog.f -m prog

然而,当我从python调用此模块时,我收到以下错误消息:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import prog
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./prog.so: undefined symbol: unknown_function_

我怀疑与我的编译参数有关,但我对Fortran不太熟悉。我是否还需要包含我的包含文件?如果是这样的话?

2 个答案:

答案 0 :(得分:3)

是的,您需要包含文件。它可能很简单:

f2py -c include_file.f prog.f -m prog

虽然我没有测试过。或者,您可能需要使用fortran include语句将include_file包含到prog中...此外,如果您对C更熟悉,几乎所有我知道的fortran编译器都使用prog.F是应由cpp预处理的fortran代码的约定。所以你可能也会以这种方式包含你的文件。

答案 1 :(得分:2)

我也遇到了这个问题,并且能够找到其他简单说明当前f2py不支持文件预处理的讨论,例如#include语句和条件编译。 https://groups.google.com/forum/#!topic/f2py-dev/aW65sEoSdG8

http://mail.scipy.org/pipermail/numpy-discussion/2009-November/046381.html

两种解决方案: 最简单:如果您使用gfortran编译代码,请将任何.f90或.f文件重命名为.F90或.F。使用大写字母键gfortran自动使用预处理器(即使您没有指定)。

第二: 使用Fortran编译器预处理文件,并将结果保存为要发送到f2py的中间Fortran代码。

gfortran -E -D<Defines-for-compiler> file.f -cpp  -o outdir/file.f

其中-E是告诉gfortran只预处理文件的命令(可能因编译器而异),-D选项用于定义在预处理期间使用的任何值。

为避免覆盖原始.f文件,必须将文件保存到另一个目录(或完全更改名称)。