2014-05-10 17 views
15

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?

+1

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? –

+0

@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. –

Trả lời

7

Tôi nghĩ rằng bạn chỉ cần ctypes, có một ví dụ hoàn chỉnh về cách gọi một chức năng lapack trên trang này: http://www.sagemath.org/doc/numerical_sage/ctypes.html

Bạn nhận được chức năng của bạn như thế này:

import ctypes 
from ctypes.util import find_library 
lapack = ctypes.cdll.LoadLibrary(find_library("lapack")) 
dgtsv = lapack.dgtsv_ 
+0

Chúc mừng - đó là đơn giản hơn rất nhiều so với tôi nghĩ rằng nó sẽ được! Tôi sẽ chấp nhận câu trả lời của bạn, nhưng tôi sẽ đợi cho đến khi kết thúc giai đoạn tiền thưởng để giải quyết nó chỉ trong trường hợp bất cứ ai khác có bất kỳ gợi ý tốt. –

Các vấn đề liên quan