F2PY 和 Windows#

警告

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

注意

SciPy 的文档包含一些关于系统级依赖项的信息,这些依赖项也经过了 Fortran 的良好测试。

广义地说,在 Windows 上使用 F2PY 存在两个问题:

  • 缺乏积极开发的 FOSS Fortran 编译器,以及,

  • 与构建 Python-C 扩展的 C 运行时库相关的链接问题。

本节的重点是建立在 Windows 上通过 F2PY 原生开发和扩展 Fortran 模块的指南。

当前支持的工具链有:

  • Mingw-w64 C/C++/Fortran 编译器

  • Intel 编译器

  • Clang-cl + Flang

  • MSVC + Flang

概述#

从用户的角度来看,最兼容 UNIX 的 Windows 开发环境是通过模拟,无论是通过适用于 Linux 的 Windows 子系统,还是通过 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 构建后端兼容。额外的构建系统用法(mesoncmake),如F2PY 和构建系统中所述,允许更灵活的编译器后端集,包括:

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

源代码 / Conda

Anaconda GFortran

Anaconda GCC

exe

要了解促使需要这种矩阵的关键问题,Pauli Virtanen 关于 Windows 上带有 Fortran 的轮子的深入文章是一个极好的资源。JeanHeyd Meneide 的这篇文章有趣地解释了应用程序二进制接口(ABI)

PowerShell 和 MSVC#

MSVC 通过 Visual Studio 套件或更轻量级(推荐)的Visual Studio 构建工具安装,并选择 使用 C++ 的桌面开发 设置。

注意

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

可以使用标准命令提示符中的结果环境。然而,使用开发人员 PowerShell,并在Windows 终端中配置一个配置文件,会更愉快。这可以通过将以下块添加到用于配置 Windows 终端的 JSON 文件(参见 设置->打开 JSON 文件)的 profiles->list 部分来实现:

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