F2PY 和 Windows#

警告

F2PY 对 Windows 的支持并不总是与 Linux 支持相同

注意

ScPy 的文档 提供了一些关于系统级依赖项的信息,这些依赖项也针对 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 子系统 (WSL) 或 Docker 来实现。类似地,传统的虚拟化方法(如 VirtualBox)也是在 Windows 上开发 UNIX 工具的合理方法。

除了使用商业编译器之外,原生 Windows 支持通常会受到阻碍。但是,截至 2022 年,大多数商业编译器都提供免费计划,足以满足一般用途。此外,f2py 支持的 Fortran 语言特性(部分覆盖 Fortran 2003)意味着通常不需要更新的工具链。简而言之,对于最终用户,按使用顺序排列

经典 Intel 编译器(商业)

这些编译器得到积极维护,但可能存在许可限制,如 F2PY 和 Windows Intel Fortran 中所述。

适用于通过构建 MSVC 构建原生 Windows 程序的用户。

MSYS2(FOSS)

结合 mingw-w64 项目,gfortrangcc 工具链可用于本地构建 Windows 程序。

Windows 子系统 (WSL)

假设使用 gfortran,这可以用于交叉编译 Windows 应用程序,但要复杂得多。

Conda

conda 中编译器的 Windows 支持是通过提取 MSYS2 二进制文件来实现的,但这些 已过时,因此不建议使用(截至 2022 年 1 月 30 日)。

PGI 编译器(商业)

未维护,但如果存在现有许可证则足够。可在本地使用,但已被 Nvidia HPC SDK 取代,并且没有 原生 Windows 支持

Cygwin(FOSS)

也可用于 gfortran。但是,Cygwin 提供的 POSIX API 兼容性层旨在在 Windows 上编译 UNIX 软件,而不是构建原生 Windows 程序。这意味着需要交叉编译。

到目前为止描述的编译套件与 现已弃用np.distutils 构建后端兼容,该后端由 F2PY CLI 公开。如 F2PY 和构建系统 中所述,其他构建系统用法(mesoncmake)允许使用更灵活的编译器后端集,包括

Intel oneAPI

较新的 Intel 编译器(ifxicx)基于 LLVM,可用于本地编译。许可证要求可能很繁琐。

经典 Flang(FOSS)

PGI 编译器的基础被提取出来,形成了“经典”或 Flang 的旧版本。这可以从源代码编译并在本地使用。LLVM Flang 尚未支持 Windows(截至 2022 年 1 月 30 日)。

LFortran(FOSS)

两个基于 LLVM 的编译器之一。并非所有 F2PY 支持的 Fortran 都可以编译(截至 2022 年 1 月 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) 工具集

使用此基线配置,我们将进一步考虑以下配置矩阵

支持矩阵,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 关于 Windows 上使用 Fortran 的 wheel 的深入文章 是一个极好的资源。JeanHeyd Meneide 的这篇文章中可以找到对应用程序二进制接口 (ABI) 的有趣解释。

PowerShell 和 MSVC#

MSVC 通过 Visual Studio Bundle 或更轻量级(首选)的 Visual Studio 构建工具(使用 Desktop development with C++ 设置)进行安装。

注意

这可能需要大量时间,因为它包括大约 2GB 的下载并需要重新启动。

可以从 标准命令提示符 使用生成的 env。但是,使用 开发人员 PowerShell 并在 Windows 终端中添加配置文件 会更方便。这可以通过将以下代码块添加到用于配置 Windows 终端的 JSON 文件的 profiles->list 部分来实现(请参阅 Settings->Open JSON file

{
"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"