Как предоставить обратные вызовы Python для Fortran с помощью модулей

Эта страница документации scipy о F2Py гласит:

[Функции обратного вызова] также могут быть явно установлены в модуле. Тогда нет необходимости передавать функцию в списке аргументов в функцию Fortran. Это может понадобиться, если функция Fortran, вызывающая функцию обратного вызова python, сама вызывается другой функцией Fortran.

Однако я не могу найти пример того, как это будет сделано.

Рассмотрим следующую комбинацию Fortran/Python:

test.f:

subroutine test(py_func)

use iso_fortran_env, only stdout => output_unit

!f2py intent(callback) py_func
external py_func
integer py_func
!f2py integer y,x
!f2py y = py_func(x)

integer :: a
integer :: b

a = 12
write(stdout, *) a

end subroutine

call_test.py:

import test

def func(x):
    return x * 2

test.test(func)

Скомпилировано с помощью следующей команды (компилятор Intel):

python f2py.py -c test.f --fcompiler=intelvem -m test

Какие изменения мне нужно было бы внести, чтобы представить func всей программе на Фортране в виде модуля, чтобы я мог вызывать функцию из подпрограммы test или любой другой подпрограммы в любом другом файле на фортране в проекте?


person JimmidyJoo    schedule 17.02.2014    source источник
comment
Помогает ли здесь код модуля? code.google.com/p/f2py/wiki/FAQ2ed выглядит так если создается новый модуль, хотя я немного запутался, является ли это модулем python или модулем fortran.   -  person Dima Tisnek    schedule 07.04.2014
comment
Извините, забыл добавить ответ, который я нашел на этот вопрос. Ваш комментарий напомнил мне. Смотри ниже.   -  person JimmidyJoo    schedule 07.04.2014


Ответы (1)


Следующее сработало для меня. Обратите внимание на отсутствие параметров, переданных для проверки. Файл python соответствует указанному в вопросе.

subroutine test()

use iso_fortran_env, only stdout => output_unit

!f2py intent(callback) py_func
external py_func
integer py_func
integer y,x
!f2py y = py_func(x)

integer :: a
integer :: b

a = 12
write(stdout, *) a

end subroutine

Кроме того, я затем обернул py_func в подпрограмму, чтобы я мог вызывать ее без необходимости объявлять следующее в каждом файле/функции, которую я использую:

integer y
y = py_func(x)
person JimmidyJoo    schedule 07.04.2014