我试图了解如何在Python3和cythonized C ++函数之间传递字符串值。但是我无法使用Cython构建库。
特别是,我不明白如何在source.pyx
中声明字符串返回值和字符串参数。使用int类型它可以正常工作。
使用clang构建期间出现的错误如下:
candidate function not viable: no known conversion from 'PyObject *' (aka '_object *') to 'char *' for 1st argument
我的source.pyx
如下:
cdef extern from "source.cpp":
cdef str fun(str param)
def pyfun(mystring):
return fun(mystring)
我的source.cpp
是:
char * fun(char *string) {
return string;
}
答案 0 :(得分:1)
除了原始代码中的错误之外,我还设法使用以下source.pyx
(Python3中的bytes
类型与C ++中的char*
之间的转换):
cdef extern from "source.cpp":
cdef char* fun(char* param)
def pyfun(mystring):
mystring_b = mystring.encode('utf-8')
rvalue = fun(mystring_b).decode('utf-8')
return rvalue
如果在malloc
内使用fun
分配内存,则还需要释放内存,否则会出现内存泄漏(使用C指针时,总是值得考虑谁拥有内存) 。执行此操作的修改版本是:
from libc.stdlib cimport free
# cdef extern as before
def pyfun(mystring):
cdef char* value_from_fun
mystring_b = mystring.encode('utf-8')
value_from_fun = fun(mystring_b)
try:
return value_from_fun.decode('utf-8')
finally:
free(value_from_fun)
类型转换的行为方式与之前相同。
根据hpaulj在原始问题中的评论,这里的libcpp.string
版本映射了std::string
中定义的C ++ <string>
:
from libcpp.string cimport string
cdef extern from "source.cpp":
cdef string fun(string param)
def pyfun(mystring):
mystring_ = mystring.encode('utf-8')
rvalue = fun(mystring_).decode('utf-8')
return rvalue