F2PY 和建置系統#

在本節中,我們將介紹各種常用的建置系統以及它們與 f2py 的用法。

在 NumPy 版本變更:1.26.x

f2py 的預設建置系統傳統上是透過增強的 numpy.distutils 模組。此模組基於 distutils,該模組已在 2023 年 10 月Python 3.12.0 中移除。與 NumPy 和 SciPy 的其餘部分一樣,f2py 現在使用 meson,詳情請參閱 numpy.distutils 的狀態和遷移建議

f2py 的所有變更都在 SciPy 上進行測試,因此它們的 CI 配置 始終受到支援。

注意

有關遷移資訊,請參閱 1 遷移至 meson

基本概念#

建置包含 Python 和 Fortran 的擴充模組包括:

  • Fortran 原始碼

  • f2py 產生的一個或多個檔案

    • 始終會建立 C 封裝器檔案

    • 具有模組的程式碼需要額外的 .f90 封裝器

    • 具有函式的程式碼會產生額外的 .f 封裝器

  • fortranobject.{c,h}

    • numpy 一起發行

    • 可以透過 python -c "import numpy.f2py; print(numpy.f2py.get_include())" 查詢

  • NumPy 標頭檔

    • 可以透過 python -c "import numpy; print(numpy.get_include())" 查詢

  • Python 函式庫和開發標頭檔

廣義上講,考慮 f2py 的輸出時,會出現三種情況:

Fortran 77 程式
  • 輸入檔案 blah.f

  • 產生

    • blahmodule.c

    • blah-f2pywrappers.f

當沒有 COMMON 區塊時,只會產生 C 封裝器檔案。也會產生封裝器,以將假定形狀陣列重寫為自動陣列。

Fortran 90 程式
  • 輸入檔案 blah.f90

  • 產生

    • blahmodule.c

    • blah-f2pywrappers.f

    • blah-f2pywrappers2.f90

f90 封裝器用於處理細分為模組的程式碼。f 封裝器為 functions 建立 subroutines。它將假定形狀陣列重寫為自動陣列。

簽名檔
  • 輸入檔案 blah.pyf

  • 產生

    • blahmodule.c

    • blah-f2pywrappers2.f90 (偶爾)

    • blah-f2pywrappers.f (偶爾)

簽名檔 .pyf 不透過檔案副檔名表示其語言標準,它們可能會根據其內容產生 F90 和 F77 特定的封裝器;這將檢查產生檔案的負擔轉移到建置系統上。

在 NumPy 版本變更:1.22.4

f2py 將根據輸入檔案 Fortran 標準(F77 或更高版本)確定性地產生封裝器檔案。--skip-empty-wrappers 可以傳遞給 f2py,以恢復先前僅在輸入需要時才產生封裝器的行為。

理論上,掌握上述要求,任何建置系統都可以調整為產生 f2py 擴充模組。在這裡,我們將介紹一些較流行的系統子集。

注意

make 在現代多語言設定中沒有地位,因此不再進一步討論。

建置系統#