通过Cython将字符串从Python传递给Fortran

时间:2016-01-05 10:37:28

标签: cython

我正在尝试使用Cython将字符串从Python传递给Fortran,但我无法使其正常工作。 我成功通过使用numpy数组的真实列表,所以我尝试通过将我的字符串转换为我的Cython例程中的char数组并将此数组传递给Fortran来做类似的事情,但是我没有在Fortran例程中获得正确的char *

我试着按照这里给出的信息:http://docs.cython.org/src/tutorial/strings.html,特别是需要使用@Field方法将我的python字符串转换为C char *,但它无法正常工作。

任何使其成功的帮助将不胜感激。以下是最低工作示例:

档案ex.pyx

encode()

档案ex.h

cdef extern from "ex.h":
    void fortfunction(int* nchar, char** outputFile)

def f(str file):

    ftmp = file.encode('UTF-8')
    cdef char* outputFile = ftmp
    cdef int   nchar      = len(file)

    fortfunction(&nchar, &outputFile)

档案ex.f90

extern void fortfunction(int* nchar, char** outputFile);

文件setup.py

module ex

  use iso_c_binding
  implicit none
  contains

  subroutine fortfunction(nchar,outputFile) bind(c)
  implicit none
  integer(c_int),    intent(in) :: nchar
  character(c_char), intent(in) :: outputFile(nchar)
  print*,'outputFile=',outputFile
  end subroutine fortfunction

end module ex

构建包,运行from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext from os import system # compile the fortran modules without linking system('ifort ex.f90 -c -o ex.o -fPIC -nofor_main') ext_modules = [Extension('ex', # module name: ['ex.pyx'], # source file: extra_link_args=['-limf','-lifcore','ex.o'])] # other files to link to setup(name = 'mymodule', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules) 这是我最终获得的

python setup.py build_ext --inplace

1 个答案:

答案 0 :(得分:3)

因为ex.f90中的伪参数outputFile(nchar)character(c_char)的数组,所以它接收该数组的第一个元素的地址。所以我认为我们应该通过char*而不是char**,这样

档案ex.pyx

cdef extern from "ex.h":
    void fortfunction(int* nchar, char* outputFile)

def f(str file):
    ftmp = file.encode('UTF-8')
    cdef char* outputFile = ftmp
    cdef int   nchar      = len(file)  

    fortfunction(&nchar, outputFile)

档案ex.h

extern void fortfunction(int* nchar, char* outputFile);

然后Cython代码似乎正常工作:

>>> import ex
>>> ex.f( 'foo' )
  outputFile=foo