我正在开发一个软件包,需要使用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],
)
请注意,为了实际使用_gtsv.so
,我仍然需要链接一个预先存在的LAPACK共享库(extra_link_args=['-llapack']
)。由于该库应该已经包含dgtsv
子例程,因此我认为将函数包装在现有的共享库中会更加清晰,而无需分发实际的Fortran源代码。
不过,我从未遇到过使用F2PY来包装共享库中的函数而不仅仅是原始Fortran源代码的示例。这种情况是否可能?
ctypes
可以解决问题。出于某种原因,我从未想到过 - 我想我一直被困在认为我需要一些特定于Fortran的方法来包装Fortran共享库的思维模式中。哦,好吧。 - ali_m