F2PY и Windows#

Предупреждение

Поддержка F2PY для Windows не всегда наравне с поддержкой для Linux

Примечание

Документация SciPy содержит некоторую информацию о системных зависимостях, которые хорошо протестированы для Fortran.

В общих чертах, есть две проблемы при работе с F2PY на Windows:

  • отсутствие активно разрабатываемых FOSS-компиляторов Fortran, и,

  • проблемы линковки, связанные с библиотекой времени выполнения C для сборки расширений Python-C.

Цель этого раздела — установить руководство по разработке и расширению модулей Fortran для Python нативно, через F2PY на Windows.

В настоящее время поддерживаются следующие наборы инструментов:

  • Компиляторы Mingw-w64 C/C++/Fortran

  • Компиляторы Intel

  • Clang-cl + Flang

  • MSVC + Flang

Обзор#

С точки зрения пользователя, наиболее совместимая с UNIX среда разработки для Windows достигается через эмуляцию, либо через подсистему Windows для Linux, либо с помощью Docker. Аналогично, традиционные методы виртуализации, такие как VirtualBox, также являются разумными способами разработки UNIX-инструментов на Windows.

Нативная поддержка Windows обычно ограничена за пределами использования коммерческих компиляторов. Однако, по состоянию на 2022 год, большинство коммерческих компиляторов имеют бесплатные тарифы, достаточные для общего использования. Кроме того, функции языка Fortran, поддерживаемые f2py (частичное покрытие Fortran 2003) означает, что более новые инструменты часто не требуются. Вкратце, для конечного пользователя, в порядке использования:

Классические компиляторы Intel (коммерческие)

Они активно поддерживаются, хотя могут применяться ограничения лицензирования, как подробно описано в F2PY и Windows Intel Fortran.

Подходит для общего использования теми, кто создает нативные программы Windows, собирая на основе MSVC.

MSYS2 (FOSS)

В сочетании с mingw-w64 проект, gfortran и gcc toolchains могут использоваться для нативной сборки программ Windows.

Подсистема Windows для Linux

Предполагая использование gfortran, это можно использовать для кросскомпиляции приложений Windows, но это значительно сложнее.

Conda

Поддержка компиляторов в Windows для conda осуществляется путем загрузки MSYS2 бинарных файлов, однако эти устарели, и поэтому не рекомендуется (по состоянию на 30-01-2022).

Компиляторы PGI (коммерческие)

Не поддерживается, но достаточно, если присутствует существующая лицензия. Работает нативно, но был заменен Nvidia HPC SDK, без нативная поддержка Windows.

Cygwin (FOSS)

Также может использоваться для gfortran. Однако слой совместимости POSIX API, предоставляемый Cygwin, предназначен для компиляции ПО UNIX в Windows, а не для создания нативных программ Windows. Это означает, что требуется кросс-компиляция.

Описаные до сих пор наборы компиляции совместимы с теперь устарело np.distutils сборщик, который предоставляется через интерфейс командной строки F2PY. Дополнительное использование системы сборки (meson, cmake) как описано в F2PY и системы сборки позволяет использовать более гибкий набор компиляторных бэкендов, включая:

Intel oneAPI

Новые компиляторы Intel (ifx, icxменьше или равны

Classic Flang (FOSS)

Основная часть компиляторов PGI была использована для формирования "классических" или устаревшая версия Flang. Это может быть скомпилировано из исходного кода и использовано нативно. LLVM Flang ещё не поддерживает Windows (30-01-2022).

LFortran (FOSS)

Один из двух компиляторов на основе LLVM. Не весь поддерживаемый F2PY Fortran может быть скомпилирован (30-01-2022), но использует MSVC для нативной линковки.

Базовый уровень#

Для этого документа мы предполагаем следующие основные инструменты:

  • Рассматриваемая IDE — это поддерживаемая сообществом Microsoft Visual Studio Code

  • Используемый терминал - это Windows Terminal

  • Предполагается, что среда оболочки является Powershell 7.x

  • Python 3.10 из Microsoft Store и это можно проверить с помощью

    Get-Command python.exe разрешая в C:\Users\$USERNAME\AppData\Local\Microsoft\WindowsApps\python.exe

  • Набор инструментов Microsoft Visual C++ (MSVC)

С этой базовой конфигурацией мы далее рассмотрим матрицу конфигурации следующим образом:

Матрица поддержки, exe подразумевает установщик для Windows#

Компилятор Fortran

C/C++ Компилятор

Источник

Intel Fortran

MSVC / ICC

exe

GFortran

MSVC

MSYS2/exe

GFortran

GCC

WSL

Classic Flang

MSVC

Источник / Conda

Anaconda GFortran

Anaconda GCC

exe

Для понимания ключевых проблем, мотивирующих необходимость такой матрицы Подробный пост Паули Виртанена о wheels с Fortran для Windows является отличным ресурсом. Занимательное объяснение двоичного интерфейса приложений (ABI) можно найти в этом посте от JeanHeyd Meneide.

PowerShell и MSVC#

MSVC устанавливается либо через пакет Visual Studio, либо через более лёгкий (предпочтительный) Инструменты сборки для Visual Studio с Desktop development with C++ настройка.

Примечание

Это может занять значительное время, так как включает загрузку около 2 ГБ и требует перезапуска.

Возможно использовать результирующую среду из стандартная командная строка. Однако приятнее использовать developer powershell, с профиль в Windows Terminal. Этого можно достичь, добавив следующий блок к profiles->list раздел JSON-файла, используемый для настройки Windows Terminal (см. 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" > blah.cpp; echo 'int main(){printf("Hi");return 1;}' >> blah.cpp
 cl blah.cpp
.\blah.exe
 # Hi
 rm blah.cpp

Также можно проверить, что среда была корректно обновлена с помощью $ENV:PATH.

Пути Python в Microsoft Store#

Версия Python для MS Windows, обсуждаемая здесь, устанавливается в недетерминированный путь с использованием хэша. Это нужно добавить в PATH переменная.

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