我在涉及創建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