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
项目,可以使用gfortran
和gcc
工具链来本地构建 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 和构建系统 中所述的额外构建系统使用(meson
、cmake
)允许更灵活的编译器后端集合,包括:
- 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) 工具集
在这个基本配置的基础上,我们将进一步考虑如下的配置矩阵:
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的下载,并且需要重新启动.
可以从 标准命令提示符 使用生成的环境.然而,使用 开发者 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"