Tôi đang phát triển một gói yêu cầu ràng buộc Python cho dgtsv
subroutine từ thư viện LAPACK Fortran. Hiện tại, tôi đang phân phối tệp nguồn Fortran, dgtsv.f
, cùng với mã Python của tôi và sử dụng numpy.distutils
để tự động quấn và biên dịch nó thành thư viện được chia sẻ, _gtsv.so
, có thể gọi được từ Python.Có thể bọc chức năng từ thư viện được chia sẻ bằng cách sử dụng F2PY không?
Đây là những gì tập tin setup.py
của tôi trông giống như tại thời điểm này:
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],
)
Lưu ý rằng để thực sự sử dụng _gtsv.so
, tôi vẫn phải liên kết với một thư viện chia sẻ tồn tại trước đó LAPACK (extra_link_args=['-llapack']
). Vì thư viện này đã có chứa các chương trình con dgtsv
, có vẻ như với tôi rằng nó sẽ được sạch hơn để chỉ quấn chức năng trong thư viện được chia sẻ hiện có, thay vì phải phân phối nguồn Fortran thực tế.
Tuy nhiên tôi chưa bao giờ gặp bất kỳ ví dụ nào về việc sử dụng F2PY để bao hàm các chức năng là một phần của thư viện được chia sẻ thay vì chỉ là mã nguồn Fortran thô. Điều này có thể không?
những gì bạn nghĩ về câu trả lời bởi @cronos? Bất kỳ lý do tại sao bạn không thể sử dụng ctypes? –
@DebanjanBasu Có, 'ctypes' sẽ thực hiện thủ thuật. Vì một lý do nào đó nó không bao giờ xảy ra với tôi - tôi cho rằng tôi đã bị mắc kẹt trong suy nghĩ rằng tôi sẽ cần một số phương pháp cụ thể của Fortran để bọc một thư viện được chia sẻ của Fortran. Oh well. –