【问题标题】:f2py with include files带有包含文件的 f2py
【发布时间】:2013-02-17 10:42:17
【问题描述】:

我正在编译一个名为 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 不太熟悉。我还需要包含我的包含文件吗?如果有怎么办?

【问题讨论】:

  • 好吧,最后我不知道这个是否会得到最终答案。我从 fortran 代码中删除了许多不必要的代码,并让它以这种方式工作。

标签: python fortran f2py


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 mgilson。我也没有那么幸运。 fortran 代码已经包含我的 include_file 的包含语句。所以也许我的问题与包含文件无关。
【解决方案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 编译器预处理文件并将结果保存为中间 Fortran 代码以发送到 f2py。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 2013-05-13
    • 2012-02-19
    • 2016-06-28
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多