F2PY 和 Windows#

警告

F2PY 对 Windows 的支持并不总是与对 Linux 的支持相匹配.

备注

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

总的来说,在Windows上使用F2PY有两个问题:

  • 缺乏积极开发的自由开源 Fortran 编译器,以及,

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

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

目前支持的工具链有:

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

  • Intel 编译器

  • Clang-cl + Flang

  • MSVC + Flang

概述#

从用户的角度来看,最兼容 UNIX 的 Windows 开发环境是通过模拟实现的,无论是通过 Windows Subsystem on Linux,还是由 Docker 辅助.同样地,传统的虚拟化方法如 VirtualBox 也是在 Windows 上开发 UNIX 工具的合理方法.

原生 Windows 支持通常在商业编译器的使用之外受到限制.然而,截至2022年,大多数商业编译器都有免费计划,这些计划足以满足一般使用.此外,``f2py`` 支持的 Fortran 语言特性(部分覆盖 Fortran 2003)意味着通常不需要更新的工具链.简而言之,对于终端用户,使用顺序如下:

经典 Intel 编译器(商业版)

这些是积极维护的,尽管可能会有许可限制,如 F2PY 和 Windows Intel Fortran 中进一步详细说明.

适用于那些通过基于 MSVC 构建本地 Windows 程序的一般用途.

MSYS2 (FOSS)

结合 mingw-w64 项目,可以使用 gfortrangcc 工具链来本地构建 Windows 程序.

Windows Subsystem for Linux

假设使用 gfortran ,这可以用于交叉编译 Windows 应用程序,但会显著更加复杂.

Conda

conda 中编译器的 Windows 支持通过拉取 MSYS2 二进制文件来实现,然而这些 已经过时,因此不推荐使用(截至 2022-01-30).

PGI 编译器 (商业)

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

Cygwin (FOSS)

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

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

Intel oneAPI

较新的 Intel 编译器 (ifx, icx) 基于 LLVM 并且可以用于本地编译.许可要求可能很繁重.

经典 Flang (FOSS)

PGI 编译器的基础部分被拆解以形成”经典”或 legacy version of Flang.这可以从源代码编译并原生使用.`LLVM Flang`_ 尚不支持 Windows(30-01-2022).

LFortran (FOSS)

两个基于LLVM的编译器之一.并非所有F2PY支持的Fortran都可以编译(30-01-2022),但使用MSVC进行本地链接.

基线#

对于本文档,我们将假设以下基本工具:

  • 正在考虑的IDE是社区支持的 Microsoft Visual Studio Code

  • 正在使用的终端是 Windows Terminal

  • 假设 shell 环境为 Powershell 7.x

  • Python 3.10 来自 微软商店 ,这可以用以下方法进行测试

    Get-Command python.exe 解析为 C:\Users\$USERNAME\AppData\Local\Microsoft\WindowsApps\python.exe

  • Microsoft Visual C++ (MSVC) 工具集

在这个基本配置的基础上,我们将进一步考虑如下的配置矩阵:

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

Fortran Compiler

C/C++ Compiler

Source

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的下载,并且需要重新启动.

可以从 标准命令提示符 使用生成的环境.然而,使用 开发者 powershellWindows 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"