2016-01-02 92 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