Python f2py-giving“;重新定义';foo';。。。以前的定义是“在这里”;

Python f2py-giving“;重新定义';foo';。。。以前的定义是“在这里”;,python,fortran,f2py,Python,Fortran,F2py,这是我的第一个问题,所以对我好一点 我正在使用NUMPY1.6.1中的f2py。我有一个fortran模块,其中包含几个子例程,可以很好地编译(和工作)。但是,其中一个使用erf(x)函数,它是GNU扩展。对于我的目的来说,它不够精确,所以我尝试使用外部erf实现 我正在尝试使用fortran 77中的数字配方中的一个,我已将所有相关函数复制到一个名为“erf.f”的文件中,该文件与我的模块位于同一文件夹中。我使用在模块文件的顶部包含'erf.f'。我将erf函数的实际名称更改为“derf”,因

这是我的第一个问题,所以对我好一点

我正在使用NUMPY1.6.1中的f2py。我有一个fortran模块,其中包含几个子例程,可以很好地编译(和工作)。但是,其中一个使用erf(x)函数,它是GNU扩展。对于我的目的来说,它不够精确,所以我尝试使用外部erf实现

我正在尝试使用fortran 77中的数字配方中的一个,我已将所有相关函数复制到一个名为“erf.f”的文件中,该文件与我的模块位于同一文件夹中。我使用
在模块文件的顶部包含'erf.f'
。我将erf函数的实际名称更改为“derf”,因此它不会与gfortran erf扩展冲突

然而,当我试图通过f2py编译时,“erf.f”中的每个函数
foo
都会出现错误

错误:“foo”的重新定义 错误:“foo”以前的定义在这里

当我看一看c文件时,它包含了重新定义和前面的定义,看起来函数确实存在两次。我只是不知道为什么

有人知道怎么解决这个问题吗?干杯

编辑:我没有提到(因为我认为这是不必要的额外信息)numpy distutils正在使用f2py创建扩展。我现在提到它的原因是,我发现我可以使用
f2py-cmy_module.f90-m mod
创建扩展,但是当运行
python setup.py install
时,我会遇到上面详述的错误。那么,当运行distutils时,f2py有什么不同之处呢


编辑#2:如果我将外部erf函数文件的所有内容与我的模块放在同一个文件中,那么一切都正常。我真的不想这样做,因为展望未来,我会有一个畸形的文件,但在我得到这个问题的答案之前,它现在可以工作。

一个解决方案是创建一个模块
erf.f90
,并使用
使用erf
(或任何名称)将其导入主代码中

我在
f2py
导入带有
.f
扩展名的模块时遇到了一些奇怪的问题,您只需将
erf.f
重命名为
erf.f90
并在使用
gfortran
编译时指定
-ffix form
,就可以让它正常工作

编辑:

如果使用
use
导入模块,则不需要同时使用
include
include
基本上是将
erf.f
的实际代码包含在主代码的源代码中(尽管正如您所注意到的,它的行为与直接在主文件中键入
erf.f
完全不同),而
use
告诉编译器查找预编译的模块

我发现
use
在使用模块和
f2py
时非常适合我。(我的代码基本上是固定格式的Fortran 90)。假设一个主文件
main.f
,一个模块
subs.f90
(确保
subs.f90
中有
module…end module
,我将使用以下顺序进行编译:

gfortran -ffixed-form -c subs.f90
f2py.py -c -m main -I/path/to/subs /path/to/subs/subs.f90 main.f

请注意,根据您的系统,您可能需要为
f2py
指定其他选项。对于我来说,在Windows上使用MinGW时,我需要
--compiler=mingw32
,因为
f2py
在其他情况下似乎无法找到C编译器。

您是否有可能用两个或三个5 li的小文件重现此问题每个人(给予或接受…)@sarnold我很快尝试了一下,但我写的编译很好。现在我正在尝试找出我的大程序和小程序之间的区别。你能从大程序中删除内容开始吗?@sarnold我可以这样做,但很明显,当通过numpy.distutils使用f2py时会出现错误。要在小规模上重新创建它将有点困难。如果您尝试只编译包含
derf
的文件,并将其与项目的其余部分链接,而不是包含源代码,会发生什么情况?当处理include时,
f2py
中可能会出现问题。我已经尝试过这一方法,因为这似乎是最好的方法,但我也会遇到同样的错误。这是almost,就好像它在包含时为每个子例程创建了一个定义,在
use
语句中创建了另一个子例程一样。但是我不知道这是否有意义。@StevenMurray,你能在你的问题中发布编译代码所用的命令吗?另请参见上面关于
use
include
的说明。我是我使用了使用f2py的numpy.distutils。但是,我找到了一个解决方案。如果我有code
main.f90
,还有另一个模块
subs.f90
,它被
main.f90
引用,但从未在我的python脚本中直接使用过,那么我将
main.f90
作为扩展添加到setup.py中,但将
subs.f90
作为扩展file.In
main.f90
我同时使用
include
use
@StevenMurray,很抱歉,我错过了关于numpy.distutils的原始问题中你的注释。我很高兴你能找到一个有效的解决方案。我想,你不应该在
main.f90中同时使用
include
use
,我怀疑至少你的一些错误是来自于此。非常感谢你的回复,到目前为止,它们非常有用。我也不认为我应该使用
包含
。我目前的方法是像你说的那样单独编译
subs.f90
模块。这很好。然后我使用distutils安装,但是我不确定将有关查找
subs
模块的信息放在何处。它可以放在共享模块中的文件列表、“依赖项”列表或包含目录中。但我尝试了这些方法,其中大多数似乎安装无误,但当我导入模块时,它不会出错