是否可以使用F2PY包装来自共享库的函数?



我正在开发一个包,它需要从LAPACK Fortran库中为dgtsv子例程绑定Python。目前,我正在分发Fortran源文件dgtsv.f,以及我的Python代码,并使用numpy.distutils自动包装它并将其编译成一个可从Python调用的共享库_gtsv.so

下面是我的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源代码。这可能吗?

我认为你只是需要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_

最新更新