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 專案結合使用,gfortrangcc 工具鏈可用於原生建置 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 公開。其他建置系統用法(mesoncmake)如 F2PY 與建置系統 中所述,允許更彈性的編譯器後端組合,包括

Intel oneAPI

較新的 Intel 編譯器(ifxicx)基於 LLVM,可用於原生編譯。授權要求可能很繁瑣。

經典 Flang (FOSS)

PGI 編譯器的骨幹被蠶食以形成 “經典” 或 舊版 Flang。這可以從原始碼編譯並原生使用。LLVM Flang 尚不支援 Windows(2022-01-30)。

LFortran (FOSS)

兩種基於 LLVM 的編譯器之一。並非所有 F2PY 支援的 Fortran 都可以編譯(2022-01-30),但使用 MSVC 進行原生連結。

基準#

對於本文檔,我們將假設以下基本工具

使用此基準配置,我們將進一步考慮以下配置矩陣

支援矩陣,exe 表示 Windows 安裝程式#

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"