Ошибка f2py: неопределенный символ

Мне нужно обернуть простой код fortran90 с помощью f2py. Модуль фортрана "test.f90"

module util

contains

FUNCTION gasdev(idum)
implicit none
INTEGER(kind=4), intent(inout) :: idum
REAL(kind=8) :: gasdev, ran2
print*,idum
gasdev = ran2(idum)
return
END FUNCTION

FUNCTION ran2(idum)
implicit none
INTEGER(kind=4), intent(inout) :: idum
REAL(kind=8) :: ran2
print*,idum
ran2=2.D0
return
END FUNCTION
end module util

а потом я оборачиваю его

f2py  -m test -c test.f90

но когда я импортирую его в python

In [2]: import test

это побудило меня сказать об ошибке

ImportError: ./test.so: undefined symbol: ran2_

Любые идеи о том, как это исправить? Спасибо.


person nye17    schedule 18.10.2011    source источник


Ответы (1)


В функции gasdev вы объявляете ran2 как внешнюю функцию. Поскольку вы не связываетесь с какой-либо такой функцией, импорт модуля завершится ошибкой.

Вместо этого удалите объявление ran2 в gasdev, и в этом случае вызов ran2 использует явный интерфейс к функции ran2 в модуле, и все заработает.

person janneb    schedule 18.10.2011
comment
Благодарю. удручает то, что код хорошо работает в самом компиляторе фортрана, а ошибка, выдаваемая f2py, мне не совсем ясна... - person nye17; 18.10.2011
comment
Конечно, компиляция будет работать нормально. Однако связывание может быть другим вопросом, если только у вас нет внешней процедуры ran2 где-то в вашей кодовой базе. - person janneb; 19.10.2011
comment
Раньше я думал, что должен обозначать внешнюю функцию с помощью ключевого слова external, никогда не осознавал, что это уже так, когда я ее объявляю... - person nye17; 19.10.2011