2013-06-19 3 views
3

Теперь я использую f2py для вызова функции Python из кода Fortran. Я пробовал очень простой пример, но это не сработало.callback Python from Fortran

Fortran90 код:

subroutine foo(fun,r) 
external fun 
integer (kind = 4) i 
real (kind = 8) r 
r=0.0D+00 
do i= 1,5 
    r=r+fun(i) 
enddo 
end 

используя командную строку:

f2py -c -m callback callback.f90

Python код:

import callback 

def f(i): 
    return i * i 
print callback.foo(f) 

Ошибка:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: `Required argument 'r' (pos 2) not found` 
+1

Я не эксперт питона, но не ошибка предположить, что два аргумента нужен? –

+0

Привет, я решил проблему. То, с чем я столкнулся, не было другим аргументом, который был необходим. Я пытался использовать другой .pyf с использованием строки commend для автоматического создания и определять, какой аргумент должен быть входным значением и который должен быть выходным значением. Тогда проблема заключается в том, что когда я вызываю функцию, типы аргументов не совпадают. Поэтому я фиксировал r как целое число, и проблема была решена. – Xiao

ответ

0

Вам необходимо объявить r как возвращаемое значение ... это хорошо, что Fortran 90 все равно. Прямо сейчас f2py предполагает, что это входное значение.

subroutine foo(fun,r) 
    external fun 
    real (kind = 8), intent(out) :: r 
    integer (kind = 4)   :: i 
    r=0.0D+00 
    do i= 1,5 
     r=r+fun(i) 
    enddo 
end 

f2py использует директивы намерений FORtran, чтобы определить то, что передается в функцию и что возвращается.

0

питон:

# -*- coding: utf-8 -*- 
import MArray 

print MArray.__doc__ 
print MArray.s1dim_array.__doc__ 
print MArray.s2dim_array.__doc__ 

print "="*60 
print help(MArray) 
print "="*60 
print help(MArray.s1dim_array) 


print "="*60 
MArray.s1dim_array([6.,7.,8.]) 


print "="*60 
MArray.s2dim_array([[6.,7.,8.],[1,2,3]]) 




subroutine S1dim_Array (iN_dim, rArray) 
    implicit none 
    integer, intent(in) :: iN_dim 
    real,  intent(in) :: rArray(iN_dim) 
    print*, iN_dim 
    print*, rArray 
    Return 
End subroutine 


subroutine S2dim_Array (iN_Row, iN_Col, rArray) 
    implicit none 
    integer, intent(in) :: iN_Row, iN_Col 
    real,  intent(in) :: rArray(iN_Row, iN_Col) 
    integer :: i , j 
    print*, iN_Row, iN_Col 
    do i = 1 , iN_Row 
    write(*,*) (rArray(i,j), j = 1,iN_Col) 
    enddo 
    Return 
End subroutine 
+0

Извините, у меня не получилось. Проблема в том, что я пытаюсь сначала вызвать код fortran из python, а затем вызвать функцию python из fortran. В fortran должна быть внешняя часть – Xiao