gpt4 book ai didi

cython - 通过 Cython 将字符串从 Python 传递到 Fortran

转载 作者:行者123 更新时间:2023-12-04 14:30:52 25 4
gpt4 key购买 nike

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

我试图遵循这里给出的信息:http://docs.cython.org/src/tutorial/strings.html ,尤其是需要使用 encode() 将我的 python 字符串转换为 C 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);

文件 ex.f90
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

文件 setup.py
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这是我最终获得的
>>> import ex
>>> ex.f('foo')
outputFile=�

最佳答案

因为虚拟参数 outputFile(nchar) ex.f90 中的数组是 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

关于cython - 通过 Cython 将字符串从 Python 传递到 Fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34609624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com