2014-05-10 73 views
15

我正在開發一個包,它需要來自LAPACK Fortran庫的dgtsv subroutine的Python綁定。目前,我將Fortran源文件dgtsv.f與我的Python代碼一起分發,並使用numpy.distutils自動將其包裝並將其編譯到可從Python調用的共享庫_gtsv.so中。是否可以使用F2PY從共享庫中打包函數?

這裏就是我的setup.py文件看起來像此刻:

from numpy.distutils.core import setup, Extension, build_ext 
import os 


fortran_sources = ["dgtsv.f"] 
gtsv = Extension(
    name="pyfnnd._gtsv", 
    sources=[os.path.join("pyfnnd", "LAPACK", ff) for ff in fortran_sources], 
    extra_link_args=['-llapack'] 
) 

setup(
    name='pyfnnd', 
    py_modules=['_fnndeconv', 'demo', '_tridiag_solvers'], 
    cmdclass={'build_ext': build_ext.build_ext}, 
    ext_modules=[gtsv], 
) 

注意的是,爲了實際使用_gtsv.so,我還是要對預先存在的LAPACK共享庫(extra_link_args=['-llapack'])鏈接。由於該庫應該已經包含dgtsv子例程,因此在我看來,將函數包裝到現有的共享庫中會更簡潔,而不必分發實際的Fortran源代碼。

但是我從來沒有遇到過任何使用F2PY來包裝屬於共享庫的函數的例子,而不是僅僅是原始的Fortran源代碼。這可能嗎?

+1

你認爲答案是什麼通過@cronos?任何你不能使用ctypes的原因? –

+0

@DebanjanBasu是的,'ctypes'可以做到這一點。由於某種原因,我從來沒有想過 - 我想我陷入了一種思維模式,爲了包裝一個Fortran共享庫,我需要一些Fortran特有的方法。好吧。 –

回答

7

我想你只需要ctypes的,對調用此頁lapack功能完整的例子:http://www.sagemath.org/doc/numerical_sage/ctypes.html

你得到你的函數是這樣的:

import ctypes 
from ctypes.util import find_library 
lapack = ctypes.cdll.LoadLibrary(find_library("lapack")) 
dgtsv = lapack.dgtsv_ 
+0

乾杯 - 這比我想象的要簡單得多!我會接受你的回答,但是我會等到賞金期結束才獎勵它,以防其他人有任何好的建議。 –

相關問題