使用SWIG从Fortran源代码创建Python模块

使用SWIG从Fortran源代码创建Python模块,python,c++,numpy,fortran,swig,Python,C++,Numpy,Fortran,Swig,我在一个项目中工作,该项目涉及为用Fortran编写的程序创建Python接口。我做了一些研究,决定使用SWIG,首先将Fortran例程暴露给C++,然后用SWIG将它们包起来。但是,我在让Python模块工作时遇到了问题 例如,我有一个Fortran函数: function sum_array(input_array, length) result(sum) implicit none integer, value, intent(in) :: length real(kind=8),

我在一个项目中工作,该项目涉及为用Fortran编写的程序创建Python接口。我做了一些研究,决定使用SWIG,首先将Fortran例程暴露给C++,然后用SWIG将它们包起来。但是,我在让Python模块工作时遇到了问题

例如,我有一个Fortran函数:

function sum_array(input_array, length) result(sum)

implicit none

integer, value, intent(in) :: length
real(kind=8), intent(in), dimension(length) :: input_array

real(kind=8) :: sum
integer :: i

sum = 0.0

do i=1, length
   sum = sum + input_array(i)
end do

end function sum_array
在C声明中:

double sum_array(double* input_array, int length);
我使用的SWIG接口文件是:

%module sum_array

%{
   #define SWIG_FILE_WITH_INIT
   #include "sum_array.h"
%}

%include "numpy.i"

%init %{
   import_array();
%}

%apply (double* IN_ARRAY1, int DIM1) {(double* input_array, int length)};

%include "sum_array.h"
此接口文件使用numpy.i接口

我正在将此代码(使用make)编译为一个共享对象,如下所示:

$ swig -python -c++ -o sum_array_wrap.cpp sum_array.i
$ gfortran -c sum_array.f90 -o sum_array.o -fpic -fno-underscoring 
$ gcc -I/usr/include/python2.7 -c sum_array_wrap.cpp -o sum_array_wrap.o -fpic -std=c++0x
$ gfortran sum_array_wrap.o sum_array.o -o _sum_array.so -shared -Wl,-soname,_sum_array.so -lstdc++
当我尝试用Python导入模块时,我从以下位置获得“NameError:name'sum_array'未定义”:

从解释器的help()中得到的信息来看,我相信链接器没有在库中包含sum_数组函数,我认为这就是问题所在

你有什么办法让它发挥作用吗


顺便说一句,关于其他工具而不是SWIG的建议是非常受欢迎的,因为这是我第一次这样做,而且我尝试这样做的唯一方法就是这个。

这次问题出在这里。FORTRAN SOMPULER不使用它,因此导出符号名称是“代码> SysAlxAlgs,但后来您用C++编译了接口,因此链接器期望看到一些类似于<>代码> Z9SUMIIAARYPDI 。解决方案是将标题内容包装到

#ifdef __cplusplus
extern "C" {
#endif

double sum_array(double* input_array, int length);

#ifdef __cplusplus
}
#endif

\u sum\u array
导入了哪些变量或函数(如果有的话)?您的意思是在Python中导入模块时?它似乎是空的,我想链接器找不到函数sum_数组的声明…我的错,那行是错误的,我没有使用它,我添加它是为了避免编译Python接口时出现警告。当我在解释器中尝试导入模块时,如果使用没有该行的.I文件,我会得到“ImportError:/home/manuel/Documents/typemaps/fortran/\u sum\u array.so:未定义符号:\u Z9sum\u arrayPdi”。这意味着
sum\u array
的依赖关系没有得到解决。如果你用正确的来源更新文章,我可能会帮助你。我修复了接口文件,但它仍然不起作用。@Manolo我很高兴它有帮助。我想你现在可以接受答案了;-)
#ifdef __cplusplus
extern "C" {
#endif

double sum_array(double* input_array, int length);

#ifdef __cplusplus
}
#endif