2016-01-02 63 views
0

我在涉及创建Fortran语言编写的程序的Python接口的一个项目工作。我做了一些研究并决定使用SWIG,首先将Fortran例程暴露给C++,然后用SWIG包装它们。但是,我无法使Python模块正常工作。创建从Fortran源代码一个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:名字‘sum_array’没有定义”来自:

from numpy.random import rand 
from _sum_array import * 

input_array = rand(5) 
sum = sum_array(input_array) 

从我在翻译的帮助()得到的信息,我相信在连接不包括在库中的sum_array功能,我认为这是问题。

关于如何使这项工作的任何想法?

顺便说一句,关于其他的工具,而不是痛饮建议十分欢迎,因为这是我第一次这样做,我试图做的正是这样一个唯一的出路。

+0

什么变量或函数(如果有的话)执行'_sum_array'导入? – hpaulj

+0

你是说当我用Python导入模块?这似乎是空的,我想链接没有找到功能sum_array的声明... – Manolo

回答

0

这回问题出在name mangling。该FORTRAN sompiler不使用它,所以出口符号名是sym_array,但后来您编译C++接口,因此链接希望看到类似_Z9sum_arrayPdi。解决方案是将标题内容封装到

#ifdef __cplusplus 
extern "C" { 
#endif 

double sum_array(double* input_array, int length); 

#ifdef __cplusplus 
} 
#endif 
+0

我的坏,该行是错误的,我没有使用它,虽然,我加的是要避免警告编译时Python界面。当我使用.i文件,而不该行我让“导入错误:/home/manuel/Documents/typemaps/fortran/_sum_array.so:未定义的符号:_Z9sum_arrayPdi ”要导入的模块在解释的时候。 – Manolo

+0

这意味着'sum_array'的依赖关系没有解析。如果您使用正确的来源更新帖子,我可能会帮助你。 –

+0

我修复了界面文件,但仍然无法正常工作。 – Manolo