Python f2py-giving“;重新定义';foo';。。。以前的定义是“在这里”;
这是我的第一个问题,所以对我好一点 我正在使用NUMPY1.6.1中的f2py。我有一个fortran模块,其中包含几个子例程,可以很好地编译(和工作)。但是,其中一个使用erf(x)函数,它是GNU扩展。对于我的目的来说,它不够精确,所以我尝试使用外部erf实现 我正在尝试使用fortran 77中的数字配方中的一个,我已将所有相关函数复制到一个名为“erf.f”的文件中,该文件与我的模块位于同一文件夹中。我使用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”,因
在模块文件的顶部包含'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。但是,我找到了一个解决方案。如果我有codemain.f90
,还有另一个模块subs.f90
,它被main.f90
引用,但从未在我的python脚本中直接使用过,那么我将main.f90
作为扩展添加到setup.py中,但将subs.f90
作为扩展file.Inmain.f90
我同时使用include
和use
@StevenMurray,很抱歉,我错过了关于numpy.distutils的原始问题中你的注释。我很高兴你能找到一个有效的解决方案。我想,你不应该在main.f90中同时使用include
和use
,我怀疑至少你的一些错误是来自于此。非常感谢你的回复,到目前为止,它们非常有用。我也不认为我应该使用包含。我目前的方法是像你说的那样单独编译subs.f90
模块。这很好。然后我使用distutils安装,但是我不确定将有关查找subs
模块的信息放在何处。它可以放在共享模块中的文件列表、“依赖项”列表或包含目录中。但我尝试了这些方法,其中大多数似乎安装无误,但当我导入模块时,它不会出错