Как я могу получить доступ к функции из FORTRAN, которая написана на Python? - PullRequest
4 голосов
/ 01 марта 2010

Есть ли способ использовать функцию python в FORTRAN? Мне дали скрипт на Python, который содержит некоторые функции, и мне нужно получить доступ к этой функции из кода FORTRAN.

Я видел 'f2py', который позволяет получить доступ к подпрограмме FORTRAN из Python, и py2exe, который скомпилирует скрипт Python в исполняемый файл. Есть ли что-нибудь для py2f? Может ли скрипт Python быть скомпилирован в объектный файл? Тогда я мог бы связать это с кодом Фортрана.

Например, рассмотрим mypython_func.py как скрипт Python, содержащий функцию, и «mainfortran.f» как основной код программы FORTRAN, который вызывает функцию Python. Я бы хотел: из mypython_func.py скомпилировать в mypython_func.o, из mainfortran.f скомпилировать в mainfortran.o (>> gfortran -c mainfortran.f), затем связать эти файлы (>> gfortran -c mainfortran. o mypython_func.o -o myexec.exe). Возможно ли что-нибудь подобное?

Спасибо за ваше время и помощь.

Винс

Ответы [ 2 ]

6 голосов
/ 01 марта 2010

Не тратьте много времени на компиляцию и перевод. Сделай это.

  1. Программа Fortran Part 1 записывает файл вещей для Python. Написать на стандартный вывод. Назовите это F1

  2. Python читает файл, выполняет вычисления Python, записывает ответы в файл для Fortran. Назовите это P.

  3. Программа Fortran Part 2 читает файл с данными из stdin. Это результаты расчетов Python.

Соедините их

F1 | python p.py | F2

Вы ничего не перекомпилируете. Также обратите внимание, что все три запускаются одновременно, что может привести к значительному ускорению.

Средний бит Python должен выглядеть примерно так.

import sys
import my_python_module
for line in sys.stdin:
    x, y, p, q = map( float, line.split() )
    print ("%8.3f"*6) % ( x, y, z, p, q, my_python_module.some_function( x, y, p, q ) )

Простая оболочка для функции, которая читает stdin и записывает stdout в удобном для Fortran формате.

4 голосов
/ 25 мая 2011
Решение * 1000000@S.Lott - это путь. Но чтобы ответить на ваш вопрос --- да, можно позвонить на Python из Фортрана. Я сделал это, сначала выставив Python с использованием C API-интерфейса Cython, затем создав интерфейс Fortran с этими функциями C с помощью модуля iso_c_binding и, наконец, вызвав их из Fortran. Он очень тяжелый и в большинстве практических задач не заслуживает внимания (используйте подход с использованием каналов), но это выполнимо (это сработало для меня).
...