15

Python で Fortran 共有ライブラリからいくつかの関数を呼び出したいと思います。私はネット上でいくつかのリンクを見つけて読んだ。

libadd = cdll.LoadLibrary('./libbin.so') 

共有オブジェクトをロードします。ただし、この共有オブジェクトには、別の共有ライブラリのシンボルが含まれています。cdll のヘルプを読みましたが、複数の共有オブジェクト ファイルを同時にロードすることはできないようです。インテル® Fortran コンパイラーによってコンパイルされている可能性が最も高いこの Fortran ライブラリーから関数を呼び出すにはどうすればよいですか?

4

3 に答える 3

21

共有オブジェクト内の関数のシグネチャを知る必要があります。ソースコード、または関数名と引数の型を説明するリファレンスはありますか?

たとえば、次のソース コード ( mult.f90 ) があります。

integer function multiply(a, b)
    integer, intent(in) :: a, b
    multiply = a * b
end function multiply

.. 複数の共有オブジェクトを一度に読み込んで使用する方法を示すために、( add.f90 ):

integer function addtwo(a, b)
    integer, intent(in) :: a, b
    addtwo = a + b
end function addtwo

コンパイル、シンボルの検査:

% gfortran-4.4 -shared -fPIC -g -o mult.so mult.f90
% gfortran-4.4 -shared -fPIC -g -o add.so add.f90
% nm -ao mult.so | grep multiply
mult.so:00000000000005cc T multiply_

共有オブジェクトのシンボル名にアンダースコアが追加されていることに注意してください。私はソースを持っているので、署名がmultiply_(int *a, int *b)であることを知っているので、 からその関数を呼び出すのは簡単ですctypes:

from ctypes import byref, cdll, c_int

mult = cdll.LoadLibrary('./mult.so')
add = cdll.LoadLibrary('./add.so')
a = c_int(2)
b = c_int(4)
print mult.multiply_(byref(a), byref(b))
print add.addtwo_(byref(a), byref(b))

出力:

8
6
于 2011-04-28T00:24:31.083 に答える
5

@sameplebiasの回答に追加します。iso_c_bindingモジュールを使用して、(任意の)fortranコンパイラに正しいC署名を生成させることができます。使用例:

module fmesh_wrapper

use iso_c_binding, only: c_double, c_int
use fmesh, only: mesh_exp

implicit none

contains

subroutine c_mesh_exp(r_min, r_max, a, N, mesh) bind(c)
real(c_double), intent(in) :: r_min
real(c_double), intent(in) :: r_max
real(c_double), intent(in) :: a
integer(c_int), intent(in) :: N
real(c_double), intent(out) :: mesh(N)
call mesh_exp(r_min, r_max, a, N, mesh)
end subroutine

! wrap more functions here
! ...

end module

これには、次の C シグネチャがあります。

void c_mesh_exp(double *r_min, double *r_max, double *a, int *N,
        double *mesh);

その後、通常どおり Python から呼び出すことができます。このアプローチの利点は、(特別なコンパイラ オプションを使用せずに) すべてのプラットフォームで機能することです。

于 2011-05-25T06:09:22.310 に答える
1

f2py (NumPy から) を機能させるには、 @samplebias からmult.f90add.f90サンプルの両方を借ります。シェルから、Python のインポート可能な共有ライブラリをコンパイルします。

f2py -c -m mult mult.f90
f2py -c -m add add.f90

それらを Python で使用します。

>>> import add
>>> import mult
>>> add.addtwo(4, 5)
9
>>> mult.multiply(4, 5)
20
于 2013-05-20T09:13:09.373 に答える