Использование F2PY
На этой странице содержится справочная информация по всем параметрам командной строки для команды f2py, а также справочная информация по внутренним функциям модуля numpy.f2py.
Использование f2py в качестве инструмента командной строки
При использовании в качестве инструмента командной строки f2py имеет три основных режима, различающихся использованием переключателей -c и -h.
1. Генерация файла сигнатур
Для сканирования исходных кодов Fortran и генерации файла сигнатур используйте
f2py -h <filename.pyf> <options> <fortran files> \
[[ only: <fortran functions> : ] \
[ skip: <fortran functions> : ]]... \
[<fortran files> ...]
Примечание
Файл исходного кода Fortran может содержать множество процедур, и часто не требуется разрешать использование всех процедур из Python. В таких случаях укажите, какие процедуры должны быть обработаны (в части only: .. : ) или какие процедуры F2PY должен игнорировать (в части skip: .. : ).
F2PY не имеет понятия о списке «по файлу» skip или only, поэтому если функции перечислены в only, никакие другие функции не будут взяты из других файлов.
Если <filename.pyf> указано как stdout, сигнатуры записываются в стандартный вывод вместо файла.
Среди других параметров (см. ниже), в этом режиме можно использовать следующие:
--overwrite-signature-
Перезаписывает существующий файл сигнатур.
2. Создание модуля расширения
Для создания модуля расширения используйте
f2py -m <modulename> <options> <fortran files> \
[[ only: <fortran functions> : ] \
[ skip: <fortran functions> : ]]... \
[<fortran files> ...]
Созданный модуль расширения сохраняется как <modulename>module.c в текущем каталоге.
Здесь <fortran files> также может содержать файлы сигнатур. Среди других параметров (см. ниже), в этом режиме можно использовать следующие:
--debug-capi-
Добавляет отладочные крючки в модуль расширения. При использовании этого модуля расширения различные диагностические сведения о обёртке выводятся в стандартный вывод, например, значения переменных, предпринятые шаги и т.д.
-include'<includefile>'-
Добавляет оператор CPP
#includeв исходный код модуля расширения.<includefile>должно быть указано в одном из следующих форматов"filename.ext" <filename.ext>
Оператор включения вставляется непосредственно перед функциями обёртки. Эта функция позволяет использовать произвольные C-функции (определённые в
<includefile>) в сгенерированных F2PY обёртках.Примечание
Этот параметр устарел. Используйте оператор
usercodeдля непосредственного указания фрагментов кода C в файлах сигнатур. --[no-]wrap-functions-
Создаёт обёртки Fortran-подпрограмм для Fortran-функций.
--wrap-functionsявляется значением по умолчанию, поскольку оно обеспечивает максимальную переносимость и независимость от компилятора. --include-paths "<path1>:<path2>..."-
Ищет файлы заголовков в заданных каталогах.
Примечание
Пути должны разделяться корректным разделителем операционной системы
pathsep, то есть:на Linux/macOS и;на Windows. ВCMakeэто соответствует использованию$<SEMICOLON>. --help-link [<list of resources names>]-
Список системных ресурсов, найденных
numpy_distutils/system_info.py. Например, попробуйтеf2py --help-link lapack_opt.
3. Сборка модуля
Для сборки модуля расширения используйте
f2py -c <options> <fortran files> \
[[ only: <fortran functions> : ] \
[ skip: <fortran functions> : ]]... \
[ <fortran/c source files> ] [ <.o, .a, .so files> ]
Если <fortran files> содержит файл сигнатур, то генерируется исходный код модуля расширения, все исходные коды Fortran и C компилируются, а затем все объектные файлы и библиотечные файлы связываются с модулем расширения <modulename>.so, который сохраняется в текущем каталоге.
Если <fortran files> не содержит файла сигнатур, то модуль расширения создаётся путём сканирования всех исходных кодов Fortran на наличие сигнатур процедур, прежде чем приступить к сборке модуля расширения.
Предупреждение
Начиная с Python 3.12, distutils был удалён. Для взаимодействия с meson используйте переменные окружения или собственные файлы. См. его FAQ для получения дополнительной информации.
Среди других параметров (см. ниже) и параметров, описанных для предыдущих режимов, можно использовать следующие.
Примечание
Изменено в версии 1.26.0: Теперь существуют два отдельных бэкенда для сборки, которые могут быть использованы, distutils и meson. Пользователям крайне рекомендуется перейти на meson, так как это значение по умолчанию выше Python 3.12.
Общие флаги сборки:
--backend <backend_type>-
Указывает бэкенд сборки для процесса компиляции. Поддерживаемые бэкенды —
mesonиdistutils. Если не указано, по умолчанию используетсяdistutils. В Python 3.12 или выше значение по умолчанию —meson. --f77flags=<string>-
Указывает флаги компилятора F77
--f90flags=<string>-
Указывает флаги компилятора F90
--debug-
Компилировать с отладочной информацией
-l<libname>-
Использовать библиотеку
<libname>при линковке. -D<macro>[=<defn=1>]-
Определить макрос
<macro>как<defn>. -U<macro>-
Определить макрос
<macro> -I<dir>-
Добавить каталог
<dir>в список каталогов, просматриваемых при поиске файлов заголовков. -L<dir>-
Добавить каталог
<dir>в список каталогов для поиска-l.
Флаги, специфичные для meson:
-
--dep <dependency>только meson -
Указывает зависимость meson для модуля. Это может быть передано несколько раз для нескольких зависимостей. Зависимости хранятся в списке для дальнейшей обработки. Пример:
--dep lapack --dep scalapackЭто определит «lapack» и «scalapack» как зависимости и удалит их из argv, оставив в списке зависимостей [«lapack», «scalapack»].
Старые флаги distutils:
-
--help-fcompilerбез meson -
Список доступных компиляторов Fortran.
-
--fcompiler=<Vendor>без meson -
Указывает тип компилятора Fortran по поставщику.
-
--f77exec=<path>без meson -
Укажите путь к компилятору F77
-
--f90exec=<path>без meson -
Укажите путь к компилятору F90
-
--opt=<string>без meson -
Укажите флаги оптимизации
-
--arch=<string>без meson -
Укажите архитектурно-зависимые флаги оптимизации
-
--nooptбез meson -
Компилировать без флагов оптимизации
-
--noarchбез meson -
Компилировать без архитектурно-зависимых флагов оптимизации
-
link-<resource>без meson -
Связать модуль расширения с <ресурс>, как определено
numpy_distutils/system_info.py. Например, для связи с оптимизированными библиотеками LAPACK (vecLib на macOS, ATLAS в других случаях), используйте--link-lapack_opt. Также см. переключатель--help-link.
Примечание
Параметр f2py -c должен быть применён либо к существующему файлу .pyf (плюс исходные/объектные/библиотечные файлы), либо необходимо указать параметр -m <modulename> (плюс исходные/объектные/библиотечные файлы). Используйте один из следующих параметров:
f2py -c -m fib1 fib1.f
или
f2py -m fib1 fib1.f -h fib1.pyf f2py -c fib1.pyf fib1.f
Для получения более подробной информации, см. документацию Python по Сборке C и C++ расширений.
При сборке модуля расширения для не-gcc компиляторов Fortran может потребоваться комбинация следующих макросов:
-DPREPEND_FORTRAN -DNO_APPEND_FORTRAN -DUPPERCASE_FORTRAN
Для тестирования производительности интерфейсов, сгенерированных F2PY, используйте -DF2PY_REPORT_ATEXIT. Тогда при завершении работы Python будет напечатан отчёт с различными временными метками. Эта функция может не работать на всех платформах, и в настоящее время поддерживается только Linux.
Для проверки того, копирует ли сгенерированный F2PY интерфейс аргументы массивов, используйте -DF2PY_REPORT_ON_ARRAY_COPY=<int>. Когда размер аргумента массива превышает <int>, сообщение о копировании отправляется в stderr.
Другие параметры
-m <modulename>-
Имя модуля расширения. По умолчанию
untitled.
Предупреждение
Не используйте этот параметр, если используется файл сигнатур (*.pyf).
Изменено в версии 1.26.3: Будет игнорировать -m если предоставлен файл pyf.
--[no-]lower-
Преобразовывать [не преобразовывать] регистр символов в
<fortran files>. По умолчанию предполагается--lowerс переключателем-h, и--no-lowerбез переключателя-h. -include<header>-
Записывает дополнительные заголовки в C-обёртку, может передаваться несколько раз, каждый раз генерирует #include <header>. Обратите внимание, что это предназначено для передачи в одинарных кавычках без пробелов, например
'-include<stdbool.h>' --build-dir <dirname>-
Все созданные F2PY файлы создаются в
<dirname>. По умолчаниюtempfile.mkdtemp(). --f2cmap <filename>-
Загрузить спецификации Fortran-to-C
KINDиз указанного файла. --quiet-
Работать тихо.
--verbose-
Работать с повышенной подробностью.
--skip-empty-wrappers-
Не генерировать файлы обёртки, если это не требуется входными данными. Это флаг обратной совместимости для восстановления поведения до 1.22.4.
-v-
Вывести версию F2PY и выйти.
Выполните f2py без каких-либо параметров, чтобы получить актуальный список доступных параметров.
Модуль Python numpy.f2py
Предупреждение
Изменено в версии 2.0.0: Раньше существовала функция f2py.compile, которая была удалена. Пользователи могут вручную обернуть python -m numpy.f2py с помощью subprocess.run и задать переменные окружения для взаимодействия с meson по мере необходимости.
При использовании numpy.f2py в качестве модуля, можно вызвать следующие функции.
Генератор интерфейса Fortran-Python.
Copyright 1999 – 2011 Pearu Peterson все права защищены. Copyright 2011 – настоящее время NumPy Developers. Разрешение на использование, модификацию и распространение этого программного обеспечения предоставляется на условиях лицензии NumPy.
НИКАКИХ ГАРАНТИЙ НЕ ВЫРАЖАЕТСЯ И НЕ ПОДРАЗУМЕВАЕТСЯ. ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК.
- numpy.f2py.get_include()[source]
-
Возвращает директорию, содержащую файлы
fortranobject.cи.h.Примечание
Эта функция не нужна при построении расширения с помощью
numpy.distutilsнапрямую из файлов.fи/или.pyfза один раз.Модули Python-расширений, созданные с помощью сгенерированного кода f2py, должны использовать
fortranobject.cв качестве исходного файла и включать заголовокfortranobject.h. Эта функция может использоваться для получения директории, содержащей оба этих файла.- Возвращает:
-
- include_pathstr
-
Полный путь к директории, содержащей
fortranobject.cиfortranobject.h.
См. также
numpy.get_include-
Функция, возвращающая директорию включения NumPy
Примечания
Введено в версии 1.21.1.
Если система сборки, которую вы используете, не поддерживает f2py, построение Python-расширения с помощью файла подписи
.pyf- двухэтапный процесс. Для модуляmymod:- Шаг 1: Запустите
python -m numpy.f2py mymod.pyf --quiet. Это сгенерирует файлыmymodmodule.cи (при необходимости)mymod-f2pywrappers.fрядом сmymod.pyf. -
Шаг 2: Соберите свой модуль Python-расширения. Для этого потребуются следующие исходные файлы:
mymodmodule.c-
mymod-f2pywrappers.f(если он был сгенерирован на шаге 1) fortranobject.c
- numpy.f2py.run_main(comline_list)[source]
-
Эквивалентно выполнению:
f2py <args>
где
<args>=string.join(<list>,' '), но в Python. Если не используется-h, эта функция возвращает словарь, содержащий информацию о сгенерированных модулях и их зависимостях от исходных файлов.Вы не можете создавать модули расширений с помощью этой функции, то есть использование
-cзапрещено. Используйте командуcompile.Примеры
Команда
f2py -m scalar scalar.fможет быть выполнена из Python следующим образом.>>> import numpy.f2py >>> r = numpy.f2py.run_main(['-m','scalar','doc/source/f2py/scalar.f']) Reading fortran codes... Reading file 'doc/source/f2py/scalar.f' (format:fix,strict) Post-processing... Block: scalar Block: FOO Building modules... Building module "scalar"... Wrote C/API module "scalar" to file "./scalarmodule.c" >>> print(r) {'scalar': {'h': ['/home/users/pearu/src_cvs/f2py/src/fortranobject.h'], 'csrc': ['./scalarmodule.c', '/home/users/pearu/src_cvs/f2py/src/fortranobject.c']}}
Автоматическое создание модулей расширения
Если вы хотите распространять свой модуль расширения f2py, вам нужно только включить файл .pyf и Fortran-код. Расширения distutils в NumPy позволяют определять модуль расширения полностью в терминах этого файла интерфейса. Действительный файл setup.py, позволяющий распространять модуль add.f (как часть пакета f2py_examples, чтобы он загружался как f2py_examples.add) выглядит так:
def configuration(parent_package='', top_path=None)
from numpy.distutils.misc_util import Configuration
config = Configuration('f2py_examples',parent_package, top_path)
config.add_extension('add', sources=['add.pyf','add.f'])
return config
if __name__ == '__main__':
from numpy.distutils.core import setup
setup(**configuration(top_path='').todict())
Установка нового пакета проста с помощью:
pip install .
предполагая, что у вас есть соответствующие разрешения на запись в каталог site-packages основного каталога для используемой версии Python. Для работы полученного пакета необходимо создать файл с именем __init__.py (в той же директории, что и add.pyf). Обратите внимание, что модуль расширения определен полностью в терминах файлов add.pyf и add.f . Преобразование файла .pyf в файл .c обрабатывается numpy.distutils.
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/f2py/usage.html