我正在尝试使用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
答案 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