F2PY 和 Windows#
警告
F2PY 在 Windows 上的支持并不总是与 Linux 支持相提并论。
注意
SciPy 的文档 包含一些关于系统级依赖项的信息,这些依赖项也经过了 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 Subsystem for Linux,还是通过 Docker。同样,传统的虚拟化方法,如 VirtualBox,也是在 Windows 上开发 UNIX 工具的合理方法。
通常,只有在使用商业编译器时,原生 Windows 支持才不会受到限制。然而,截至 2022 年,大多数商业编译器都有免费套餐,足以满足一般使用需求。此外,f2py 支持的 Fortran 语言特性(Fortran 2003 的部分覆盖)意味着通常不需要较新的工具链。简而言之,对于最终用户,按使用顺序排列:
- 经典 Intel 编译器(商业)
这些编译器得到积极维护,但根据 F2PY 和 Windows Intel Fortran 中进一步详细说明的许可限制,可能会有适用。
适用于通过 MSVC 构建原生 Windows 程序进行一般使用。
- MSYS2 (FOSS)
结合
mingw-w64项目,可以使用gfortran和gcc工具链来原生构建 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 构建后端兼容。如 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 Terminal。
假定的 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 |
Source / Conda |
Anaconda GFortran |
Anaconda GCC |
exe |
为了理解驱动这种矩阵需求的关键词,Pauli Virtanen 关于 Windows Fortran 轮子的深度文章是一个很好的资源。JeanHeyd Meneide 在这篇文章中对应用程序二进制接口 (ABI) 的解释也很有趣。
PowerShell 和 MSVC#
MSVC 通过 Visual Studio Bundle 或更轻量级(推荐)的Visual Studio Build Tools 安装,并带有 C++ 桌面开发 设置。
注意
这可能需要相当长的时间,因为它包含约 2GB 的下载,并且需要重启。
可以使用标准命令提示符的结果环境。然而,使用开发者 PowerShell,并在 Windows 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"