2014-02-17 1 views
5

This scipy documentation page о F2Py состояниях:Как экспонировать обратные вызовы Python для Fortran с использованием модулей

[Callback функции] также могут быть явно установлены в модуле. Затем нет необходимости передавать функцию в списке аргументов в функцию 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 на всю Fortran программы в виде модуля, так что я мог бы вызвать функцию внутри подпрограммы test, или любой другой подпрограммы в любом другом FORtran файла проект?

+0

ли код модуля здесь помощь ? https://code.google.com/p/f2py/wiki/FAQ2ed, похоже, что новый модуль создан, хотя я немного смущен, является ли он модулем python или модулем fortran. –

+0

Извините, забыли добавить ответ, который я нашел по этому вопросу. Ваш комментарий напомнил мне. Смотри ниже. – JimmidyJoo

ответ

2

Следующие работали для меня. Обратите внимание на отсутствие параметров, прошедших проверку. Файл 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^