繁体   English   中英

是否可以使用F2PY从共享库中包装函数?

[英]Is it possible to wrap a function from a shared library using 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_

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM