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 子系统 (WSL) 或 Docker 来实现。类似地,传统的虚拟化方法(如 VirtualBox)也是在 Windows 上开发 UNIX 工具的合理方法。
除了使用商业编译器之外,原生 Windows 支持通常会受到阻碍。但是,截至 2022 年,大多数商业编译器都提供免费计划,足以满足一般用途。此外,f2py
支持的 Fortran 语言特性(部分覆盖 Fortran 2003)意味着通常不需要更新的工具链。简而言之,对于最终用户,按使用顺序排列
- 经典 Intel 编译器(商业)
这些编译器得到积极维护,但可能存在许可限制,如 F2PY 和 Windows Intel Fortran 中所述。
适用于通过构建 MSVC 构建原生 Windows 程序的用户。
- MSYS2(FOSS)
结合
mingw-w64
项目,gfortran
和gcc
工具链可用于本地构建 Windows 程序。- Windows 子系统 (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 和构建系统 中所述,其他构建系统用法(meson
、cmake
)允许使用更灵活的编译器后端集,包括
- Intel oneAPI
较新的 Intel 编译器(
ifx
、icx
)基于 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) 工具集
使用此基线配置,我们将进一步考虑以下配置矩阵
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 的 wheel 的深入文章 是一个极好的资源。JeanHeyd Meneide 的这篇文章中可以找到对应用程序二进制接口 (ABI) 的有趣解释。
PowerShell 和 MSVC#
MSVC 通过 Visual Studio Bundle 或更轻量级(首选)的 Visual Studio 构建工具(使用 Desktop development with C++
设置)进行安装。
注意
这可能需要大量时间,因为它包括大约 2GB 的下载并需要重新启动。
可以从 标准命令提示符 使用生成的 env。但是,使用 开发人员 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"