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 Subsystem for 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 年 1 月 30 日)。

PGI 编译器(商业)

未维护但如果已有许可证则足够。原生工作,但已被 Nvidia HPC SDK 取代,没有原生 Windows 支持

Cygwin (FOSS)

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

到目前为止描述的编译套件与 F2PY CLI 暴露的现已弃用np.distutils 构建后端兼容。如 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 进行原生链接。

基线#

本文档将假设以下基本工具:

有了这个基线配置,我们将进一步考虑一个如下的配置矩阵:

支持矩阵,exe 表示 Windows 安装程序#

Fortran 编译器

C/C++ 编译器

来源

Intel Fortran

MSVC / ICC

exe

GFortran

MSVC

MSYS2/exe

GFortran

GCC

WSL

经典 Flang

MSVC

Source / Conda

Anaconda GFortran

Anaconda GCC

exe

为了理解驱动这种矩阵需求的关键词,Pauli Virtanen 关于 Windows Fortran 轮子的深度文章是一个很好的资源。JeanHeyd Meneide 在这篇文章中对应用程序二进制接口 (ABI) 的解释也很有趣。

PowerShell 和 MSVC#

MSVC 通过 Visual Studio Bundle 或更轻量级(推荐)的Visual Studio Build Tools 安装,并带有 C++ 桌面开发 设置。

注意

这可能需要相当长的时间,因为它包含约 2GB 的下载,并且需要重启。

可以使用标准命令提示符的结果环境。然而,使用开发者 PowerShell,并在 Windows Terminal 中进行配置会更令人愉快。这可以通过将以下代码块添加到用于配置 Windows Terminal 的 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 路径#

这里讨论的 Python 的 MS Windows 版本安装到一个非确定性路径,使用一个哈希值。这需要添加到 PATH 变量。

$Env:Path += ";$env:LOCALAPPDATA\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\scripts"