如何将字符串从 Python3 传递到磁盘化的C++函数

How to pass string from Python3 to cythonized C++ function

本文关键字:磁盘 函数 C++ 字符串 Python3      更新时间:2023-10-16

我正在尝试了解如何在 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;
}

除了原始代码中的错误之外,我还设法使其使用以下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

如果使用fun中的malloc分配内存,则还需要释放内存,否则会出现内存泄漏(使用 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映射C++std::string<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