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 子系统 Linux (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 子系统 Linux (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 轮子的深入文章是一个极好的资源。JeanHeyd Meneide 的这篇文章对应用程序二进制接口 (ABI) 做了有趣的解释。

PowerShell 和 MSVC#

MSVC 是通过 Visual Studio 套件或更轻量级的(首选)Visual Studio 构建工具(带有 Desktop development with C++ 设置)安装的。

注意

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

可以从 标准命令提示符 使用生成的程序。但是,使用 开发人员 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"