F2PY 和 Windows#

警告

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

备注

SciPy’s documentation 包含有关 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 开发环境是通过仿真,无论是通过 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 二进制文件来实现,但是这些 are outdated 文件已经过时,因此不建议使用(截至 2022 年 1 月 30 日).

PGI 编译器 (商业版)

未维护,但如果存在现有许可证则足够.可以原生工作,但已被 Nvidia HPC SDK 取代,Nvidia HPC SDK 没有 native Windows support .

Cygwin (FOSS)

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

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

Intel oneAPI

较新的 Intel 编译器 ( ifx , icx ) 基于 LLVM,可用于原生编译.许可要求可能很繁琐.

Classic Flang (FOSS)

为了形成 Flang 的"经典"或 legacy version of Flang ,对 PGI 编译器的支柱进行了改造.这可以从源代码编译并原生使用. 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

Classic Flang

MSVC

Source / Conda

Anaconda GFortran

Anaconda GCC

exe

要了解促使需要这种矩阵的关键问题, Pauli Virtanen’s in-depth post on wheels with Fortran for Windows 是一篇极好的资源.关于应用程序二进制接口 (ABI) 的有趣解释可以在 JeanHeyd Meneide 的这篇文章中找到.

PowerShell 和 MSVC#

MSVC 可以通过 Visual Studio Bundle 或更轻量级(首选)的 Build Tools for Visual Studio 安装,并带有 Desktop development with C++ 设置.

备注

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

可以从 standard command prompt 使用生成的环境.但是,使用 developer powershellprofile in Windows Terminal 会更令人愉快.这可以通过将以下块添加到用于配置 Windows Terminal 的 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 路径#

此处讨论的 Python 的 MS Windows 版本使用哈希安装到非确定性路径.这需要添加到 PATH 变量中.

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