我在涉及创建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功能,我认为这是问题。
关于如何使这项工作的任何想法?
顺便说一句,关于其他的工具,而不是痛饮建议十分欢迎,因为这是我第一次这样做,我试图做的正是这样一个唯一的出路。
什么变量或函数(如果有的话)执行'_sum_array'导入? – hpaulj
你是说当我用Python导入模块?这似乎是空的,我想链接没有找到功能sum_array的声明... – Manolo