Использование F2PY#
Эта страница содержит справочник по всем параметрам командной строки для f2py
команда, а также ссылка на внутренние функции numpy.f2py
модуль.
Используя f2py как инструмент командной строки#
При использовании в качестве инструмента командной строки, f2py имеет три основных режима, различаемых
по использованию -c и -h переключает.
1. Генерация файла сигнатур#
Для сканирования исходных кодов Fortran и создания файла сигнатур используйте
f2py -h files> \
[[ only: functions> : ] \
[ skip: functions> : ]]... \
[ files> ...]
Примечание
Исходный файл Fortran может содержать множество подпрограмм, и часто нет необходимости разрешать использование всех подпрограмм из Python. В таких случаях либо укажите, какие подпрограммы должны быть обернуты (в only: .. : часть)
или какие подпрограммы F2PY должен игнорировать (в skip: .. : часть).
F2PY не имеет концепции «на файл» skip или only список, поэтому если функции перечислены в only, никакие другие функции не будут взяты из других файлов.
Если указывается как stdout, тогда сигнатуры записываются в
стандартный вывод вместо файла.
Среди других опций (см. ниже) в этом режиме можно использовать следующие:
--overwrite-signatureПерезаписывает существующий файл сигнатуры.
2. Построение расширяющего модуля#
Для создания модуля расширения используйте
f2py -m files> \
[[ only: functions> : ] \
[ skip: functions> : ]]... \
[ files> ...]
Созданный модуль расширения сохраняется как в
текущий каталог.
Здесь также может содержать файлы подписей. Среди других опций (см. ниже) в этом режиме можно использовать следующие опции:
--debug-capiДобавляет отладочные хуки в модуль расширения. При использовании этого модуля расширения различная диагностическая информация об обёртке записывается в стандартный вывод, например, значения переменных, выполненные шаги и т.д.
-include'' Добавить CPP
#includeоператор в исходный код модуля расширения.должен быть указан в одной из следующих форм"filename.ext" <filename.ext>
Оператор include вставляется непосредственно перед функциями-обёртками. Эта функция позволяет использовать произвольные C-функции (определённые в
) в обёртках, сгенерированных F2PY.Примечание
Эта опция устарела. Используйте
usercodeутверждение для указания фрагментов кода C непосредственно в файлах сигнатур.--[no-]wrap-functionsСоздание обёрток подпрограмм Fortran для функций Fortran.
--wrap-functionsявляется значением по умолчанию, потому что это обеспечивает максимальную переносимость и независимость от компилятора.--[no-]freethreading-compatibleСоздайте модуль, который объявляет, требует он GIL или нет. По умолчанию
--no-freethreading-compatibleдля обратной совместимости. Проверьте код Fortran, который вы оборачиваете, на проблемы потокобезопасности перед передачей--freethreading-compatible, какf2pyне анализирует код Fortran на проблемы с потокобезопасностью.--include-paths ": ..." Поиск включаемых файлов из заданных каталогов.
Примечание
Пути должны разделяться корректным разделителем операционной системы
pathsep, то есть:на Linux / MacOS и;в Windows. ВCMakeэто соответствует использованию$.--help-link [- of resources names>]
Список системных ресурсов, найденных
numpy_distutils/system_info.py. Например, попробуйтеf2py --help-link lapack_opt.
3. Построение модуля#
Для построения модуля расширения используйте
f2py -c files> \
[[ only: functions> : ] \
[ skip: functions> : ]]... \
[ source files> ] [ <.o, .a, .so files> ]
Если содержит файл сигнатуры, то создаётся исходный код для модуля расширения, все исходные коды Fortran и C компилируются, и, наконец, все объектные и библиотечные файлы связываются с модулем расширения
который сохраняется в текущем каталоге.
Если не содержит файл сигнатуры, то модуль расширения строится путём сканирования всех исходных кодов Fortran на наличие сигнатур подпрограмм перед сборкой модуля расширения.
Предупреждение
Начиная с Python 3.12, distutils был удален. Используйте переменные
окружения или нативные файлы для взаимодействия с meson вместо. См. его Часто задаваемые вопросы для получения дополнительной информации.
Среди других опций (см. ниже) и опций, описанных для предыдущих режимов, можно использовать следующие.
Примечание
Изменено в версии 1.26.0: Теперь доступны две отдельные системы сборки, которые можно использовать, distutils
и meson. Пользователи сильно рекомендуется перейти на meson
поскольку это значение по умолчанию выше Python 3.12.
Общие флаги сборки:
--backendУкажите бэкенд сборки для процесса компиляции. Поддерживаемые бэкенды:
mesonиdistutils. Если не указано, по умолчаниюdistutils. В Python 3.12 или выше по умолчанию используетсяmeson.--f77flags=Укажите флаги компилятора F77
--f90flags=Указать флаги компилятора F90
--debugКомпиляция с отладочной информацией
-lИспользуйте библиотеку
при связывании.-D[= ] Определить макрос
как.-UОпределить макрос
-IДобавить каталог
в список каталогов, в которых производится поиск включаемых файлов.-LДобавить каталог
в список директорий для поиска-l.
The meson специфичные флаги:
--depтолько mesonУкажите зависимость meson для модуля. Это может быть передано несколько раз для нескольких зависимостей. Зависимости сохраняются в списке для дальнейшей обработки. Пример:
--dep lapack --dep scalapackЭто определит 'lapack' и 'scalapack' как зависимости и удалит их из argv, оставив список зависимостей, содержащий ['lapack', 'scalapack'].
Старый distutils флаги:
--help-fcompilerнет mesonПеречислите доступные компиляторы Fortran.
--fcompiler=нет mesonУкажите тип компилятора Fortran по производителю.
--f77exec=нет mesonУкажите путь к компилятору F77
--f90exec=нет mesonУкажите путь к компилятору F90
--opt=нет mesonУкажите флаги оптимизации
--arch=нет mesonУкажите флаги оптимизации для конкретной архитектуры
--nooptнет mesonКомпиляция без флагов оптимизации
--noarchнет mesonКомпилировать без флагов оптимизации, зависящих от архитектуры
link-нет mesonСвяжите модуль расширения с
, как определено в numpy_distutils/system_info.pyНапример, для связи с оптимизированными библиотеками LAPACK (vecLib на MacOSX, ATLAS в других системах), используйте--link-lapack_opt. См. также--help-linkпереключатель.
Примечание
The f2py -c опция должна быть применена либо к существующему .pyf файл
(плюс исходные/объектные/библиотечные файлы) или необходимо указать
-m опция (плюс исходные/объектные/библиотечные файлы). Используйте одну из
следующих опций:
f2py -c -m fib1 fib1.f
или
f2py -m fib1 fib1.f -h fib1.pyf
f2py -c fib1.pyf fib1.f
Для получения дополнительной информации см. Сборка расширений на C и C++ Python документация для подробностей.
При сборке расширяемого модуля может потребоваться комбинация следующих макросов для компиляторов Fortran, отличных от gcc:
-DPREPEND_FORTRAN
-DNO_APPEND_FORTRAN
-DUPPERCASE_FORTRAN
Для тестирования производительности интерфейсов, сгенерированных F2PY, используйте
-DF2PY_REPORT_ATEXIT. Затем при выходе из Python выводится отчет о различных временных показателях.
Эта функция может не работать на всех платформах, и в настоящее время поддерживается
только Linux.
Чтобы проверить, выполняет ли интерфейс, сгенерированный F2PY, копирование аргументов массива, используйте
-DF2PY_REPORT_ON_ARRAY_COPY=. Когда размер аргумента массива
больше, чем , сообщение о копировании отправляется в stderr.
Другие опции#
-mИмя модуля расширения. По умолчанию
untitled.
Предупреждение
Не используйте эту опцию, если файл сигнатуры (*.pyf) используется.
Изменено в версии 1.26.3: Будет игнорировать -m если pyf файл предоставлен.
--[no-]lowerНе [снижать] регистр в
. По умолчанию,files> --lowerпредполагается с-hпереключатель, и--no-lowerбез-hпереключатель.-includeЗаписывает дополнительные заголовки в C-обёртку, может передаваться несколько раз, генерирует #include
каждый раз. Обратите внимание, что это должно передаваться в одинарных кавычках и без пробелов, например '-include' --build-dirВсе сгенерированные F2PY файлы создаются в
. По умолчаниюtempfile.mkdtemp().--f2cmapЗагрузить 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 to Python Interface Generator.
Авторские права 1999 – 2011 Pearu Peterson, все права защищены. Авторские права 2011 – настоящее время Разработчики NumPy. Разрешение на использование, изменение и распространение этого программного обеспечения предоставляется на условиях лицензии NumPy.
НИКАКИХ ГАРАНТИЙ НЕ ПРЕДОСТАВЛЯЕТСЯ. ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК.
- numpy.f2py.get_include()[источник]#
Возвращает каталог, содержащий
fortranobject.cи.hфайлы.Примечание
Эта функция не требуется при сборке расширения с
numpy.distutilsнепосредственно из.fи/или.pyfфайлы за один раз.Модули расширения Python, собранные с кодом, сгенерированным f2py, должны использовать
fortranobject.cкак исходный файл, и включитьfortranobject.hзаголовок. Эта функция может использоваться для получения каталога, содержащего оба этих файла.- Возвращает:
- include_pathstr
Абсолютный путь к каталогу, содержащему
fortranobject.cиfortranobject.h.
Смотрите также
numpy.get_includeфункция, возвращающая директорию 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.cmymod-f2pywrappers.f(если он был сгенерирован на Шаге 1)fortranobject.c
- numpy.f2py.run_main(comline_list)[источник]#
Эквивалентно выполнению:
f2py <args>
где
, но на Python. Если только=string.join( ')- ,'
-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.
Сборка с помощью Meson (Примеры)#
Использование f2py с Meson#
Meson — современная система сборки, рекомендуемая для сборки модулей расширения Python, особенно начиная с Python 3.12 и NumPy 2.x. Meson предоставляет надежный и поддерживаемый способ сборки расширений Fortran с f2py.
Для сборки Fortran расширения с использованием f2py и Meson, вы можете использовать
custom_target для вызова f2py и генерации модуля расширения. Следующий минимальный пример демонстрирует, как это сделать:
Этот пример показывает, как построить add расширение из add.f и add.pyf
файлы, описанные в Примеры F2PY (обратите внимание, что не всегда нужен
.pyf файл: во многих случаях f2py может самостоятельно определить аннотации).
Структура проекта:
- f2py_examples/
meson.build add.f add.pyf (опционально) __init__.py (может быть пустым)
Пример meson.build:
project('f2py_examples', 'fortran')
py = import('python').find_installation()
# List your Fortran source files
sources = files('add.pyf', 'add.f')
# Build the extension by invoking f2py via a custom target
add_mod = custom_target(
'add_extension',
input: sources,
output: ['add' + py.extension_suffix()],
command: [
py.full_path(), '-m', 'numpy.f2py',
'-c', 'add.pyf', 'add.f',
'-m', 'add'
],
build_by_default: true
)
# Install into site-packages under the f2py_examples package
install_subdir('.', install_dir: join_paths(py.site_packages_dir(), 'f2py_examples'),
strip_directory: false,
exclude_files: ['meson.build'])
# Also install the built extension (place it beside __init__.py)
install_data(add_mod, install_dir: join_paths(py.site_packages_dir(), 'f2py_examples'))
Для получения более подробной информации и расширенного использования см. руководство по сборке Meson в пользовательской документации или обратитесь к файлам сборки Meson SciPy для реальных примеров: scipy/scipy