ali*_*i_m 16 python distutils numpy lapack f2py
我正在开发一个包,它需要来自LAPACK Fortran库的dgtsv
子例程的 Python绑定.目前,我正在分发Fortran源文件,dgtsv.f
以及我的Python代码,并使用numpy.distutils
它自动包装并将其编译成_gtsv.so
可从Python调用的共享库.
这是我的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],
)
Run Code Online (Sandbox Code Playgroud)
请注意,为了实际使用_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_
Run Code Online (Sandbox Code Playgroud)