python fortran f2py

Devolver una cadena de texto de fortran subrutina a python usando f2py



(1)

El problema aquí es con la declaración del carácter len=* . le está diciendo al compilador de Fortran que acepte cualquier cadena de longitud que se ingresó. Eso es genial, excepto cuando lo envuelve con f2py y tiene la intención de out , f2py necesita adivinar qué longitud de cadena asignar y pasar a su función y no tiene forma de hacerlo. (Después de todo, ¿qué longitud de cadena debería asumir?).

Me parece que f2py supone una cadena de longitud 0. Cuando asigna una cadena más grande a una cadena más pequeña en fortran, el resultado se trunca (aunque tendría que volver atrás y leer el estándar para averiguar si eso podría provocar errores de memoria). En cualquier caso, parece que eso es lo que está haciendo el compilador gnu.

Si lo cambia a len=3 , funciona.

Alternativamente, hacer algo como esto puede hacer que esto funcione para f2py sin modificar el código original (a excepción de algunos comentarios):

!f2py character(len=256),intent(out):: chid character(len=*),intent(out):: chid ! char. identifier

Tengo este sencillo módulo en Fortran:

test.f90 :

module test implicit none contains subroutine foo(chid) implicit none character(len=*),intent(out):: chid ! char. identifier chid = "foo" end subroutine foo end module test program bar use test character(len=20) text call foo(text) write(*,*) text end program bar

compilándolo (en Windows) gfortran test.f90 -o test.exe y ejecutándolo da, como se esperaba:

foo

También puedo compilarlo usando f2py: c:/Python27/python.exe c:/Python27/Scripts/f2py.py --fcompiler=gnu95 --compiler=mingw32 -c -m test /test.f90

Cuando ejecuto este script de Python:

test.py :

from id_map import test print "This should be ''foo'':" print test.foo() print "was it?"

Obtengo el siguiente resultado:

This should be ''foo'': was it?

Como puede ver, la cadena que debería ser "foo" está vacía. ¿Por qué es esto?