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
在現代多語言設定中沒有地位,因此不再進一步討論。