F2PY 與 Windows#
警告
F2PY 對 Windows 的支援不總是與 Linux 支援同等
注意
SciPy 的文件有一些關於系統層級依賴性的資訊,這些依賴性對於 Fortran 也經過良好測試。
廣泛來說,在 Windows 上使用 F2PY 有兩個問題
缺乏積極開發的 FOSS Fortran 編譯器,以及,
與用於建置 Python-C 擴充功能的 C 執行時期函式庫相關的連結問題。
本節的重點是建立一份在 Windows 上透過 F2PY 原生開發和擴充 Python 的 Fortran 模組的指南。
目前支援的工具鏈有
Mingw-w64 C/C++/Fortran 編譯器
Intel 編譯器
Clang-cl + Flang
MSVC + Flang
概述#
從使用者的角度來看,最相容於 UNIX 的 Windows 開發環境是透過模擬,無論是透過 Windows Linux 子系統,還是透過 Docker 來促進。類似地,像 VirtualBox 這樣的傳統虛擬化方法也是在 Windows 上開發 UNIX 工具的合理方法。
原生 Windows 支援通常在使用商業編譯器以外的情況下受到阻礙。然而,截至 2022 年,大多數商業編譯器都有免費方案,足以用於一般用途。此外,f2py
支援的 Fortran 語言功能(部分涵蓋 Fortran 2003),意味著通常不需要更新的工具鏈。簡而言之,對於終端使用者而言,依使用順序排列
- 經典 Intel 編譯器(商業)
這些編譯器被積極維護,但授權限制可能適用,詳情請見 F2PY 與 Windows Intel Fortran。
適用於透過建置 MSVC 來建置原生 Windows 程式的通用用途。
- MSYS2 (FOSS)
與
mingw-w64
專案結合使用,gfortran
和gcc
工具鏈可用於原生建置 Windows 程式。- 適用於 Linux 的 Windows 子系統
假設使用
gfortran
,這可以用於交叉編譯 Windows 應用程式,但會複雜得多。- Conda
conda
中編譯器的 Windows 支援是透過拉取 MSYS2 二進制檔案來促進的,但是這些 已過時,因此不建議使用(截至 2022-01-30)。- PGI 編譯器(商業)
未維護但如果存在現有授權則足夠。原生運作,但已被 Nvidia HPC SDK 取代,且沒有 原生 Windows 支援。
- Cygwin (FOSS)
也可用於
gfortran
。但是,Cygwin 提供的 POSIX API 相容性層旨在在 Windows 上編譯 UNIX 軟體,而不是建置原生 Windows 程式。這表示需要交叉編譯。
到目前為止描述的編譯套件與 現在已棄用 的 np.distutils
建置後端相容,該後端由 F2PY CLI 公開。其他建置系統用法(meson
、cmake
)如 F2PY 與建置系統 中所述,允許更彈性的編譯器後端組合,包括
- Intel oneAPI
較新的 Intel 編譯器(
ifx
、icx
)基於 LLVM,可用於原生編譯。授權要求可能很繁瑣。- 經典 Flang (FOSS)
PGI 編譯器的骨幹被蠶食以形成 “經典” 或 舊版 Flang。這可以從原始碼編譯並原生使用。LLVM Flang 尚不支援 Windows(2022-01-30)。
- LFortran (FOSS)
兩種基於 LLVM 的編譯器之一。並非所有 F2PY 支援的 Fortran 都可以編譯(2022-01-30),但使用 MSVC 進行原生連結。
基準#
對於本文檔,我們將假設以下基本工具
正在考慮的 IDE 是社群支援的 Microsoft Visual Studio Code
正在使用的終端機是 Windows 終端機
Shell 環境假設為 Powershell 7.x
- 來自 Microsoft Store 的 Python 3.10,可以使用以下命令進行測試
Get-Command python.exe
解析為C:\Users\$USERNAME\AppData\Local\Microsoft\WindowsApps\python.exe
Microsoft Visual C++ (MSVC) 工具組
使用此基準配置,我們將進一步考慮以下配置矩陣
Fortran 編譯器 |
C/C++ 編譯器 |
來源 |
---|---|---|
Intel Fortran |
MSVC / ICC |
exe |
GFortran |
MSVC |
MSYS2/exe |
GFortran |
GCC |
WSL |
經典 Flang |
MSVC |
來源 / Conda |
Anaconda GFortran |
Anaconda GCC |
exe |
為了理解促使需要此矩陣的關鍵問題,Pauli Virtanen 關於使用 Fortran 為 Windows 建置 Python wheels 的深入文章 是一份極佳的資源。關於應用程式二進制介面 (ABI) 的有趣解釋可以在 JeanHeyd Meneide 的這篇文章中找到。
PowerShell 與 MSVC#
MSVC 可以透過 Visual Studio Bundle 或較輕量級的(首選)Visual Studio 的建置工具 安裝,並選擇 使用 C++ 的桌面開發
設定。
注意
這可能需要相當長的時間,因為它包含約 2GB 的下載量,並且需要重新啟動。
可以使用來自 標準命令提示字元 的結果環境。但是,使用 開發人員 powershell,以及在 Windows 終端機中的設定檔,會更令人愉快。這可以透過將以下區塊添加到用於配置 Windows 終端機的 JSON 檔案的 profiles->list
區段來實現(請參閱 設定->開啟 JSON 檔案
)
{
"name": "Developer PowerShell for VS 2019",
"commandline": "powershell.exe -noe -c \"$vsPath = (Join-Path ${env:ProgramFiles(x86)} -ChildPath 'Microsoft Visual Studio\\2019\\BuildTools'); Import-Module (Join-Path $vsPath 'Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'); Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation\"",
"icon": "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png"
}
現在,測試編譯器工具鏈可能看起來像
# New Windows Developer Powershell instance / tab
# or
$vsPath = (Join-Path ${env:ProgramFiles(x86)} -ChildPath 'Microsoft Visual Studio\\2019\\BuildTools');
Import-Module (Join-Path $vsPath 'Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll');
Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation
**********************************************************************
** Visual Studio 2019 Developer PowerShell v16.11.9
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
cd $HOME
echo "#include<stdio.h>" > blah.cpp; echo 'int main(){printf("Hi");return 1;}' >> blah.cpp
cl blah.cpp
.\blah.exe
# Hi
rm blah.cpp
也可以使用 $ENV:PATH
檢查環境是否已正確更新。
Microsoft Store Python 路徑#
此處討論的 MS Windows 版本的 Python 安裝到使用雜湊的非確定性路徑。這需要添加到 PATH
變數。
$Env:Path += ";$env:LOCALAPPDATA\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\scripts"