如何将字符串从Python3传递到cythonized C++;功能 我试图理解如何在Python和Cython C++函数之间传递字符串值。然而,我无法用Cython构建库

如何将字符串从Python3传递到cythonized C++;功能 我试图理解如何在Python和Cython C++函数之间传递字符串值。然而,我无法用Cython构建库,c++,python-3.x,cython,cythonize,C++,Python 3.x,Cython,Cythonize,特别是,我不明白如何在source.pyx中声明字符串返回值和字符串参数。对于int类型,它可以正常工作 我在使用clang构建过程中遇到的错误如下: candidate function not viable: no known conversion from 'PyObject *' (aka '_object *') to 'char *' for 1st argument cdef extern from "source.cpp": cdef str fun(str param)

特别是,我不明白如何在
source.pyx
中声明字符串返回值和字符串参数。对于int类型,它可以正常工作

我在使用clang构建过程中遇到的错误如下:

candidate function not viable: no known conversion from 'PyObject *' (aka '_object *') to 'char *' for 1st argument
cdef extern from "source.cpp":
  cdef str fun(str param)

def pyfun(mystring):
  return fun(mystring)
我的
source.pyx
如下所示:

candidate function not viable: no known conversion from 'PyObject *' (aka '_object *') to 'char *' for 1st argument
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中键入
字节
和在C++中键入
char*
之间进行转换)一起工作:

如果使用
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)
类型转换的操作方式与以前相同


编辑

在原问题中按“注释”,这里是“代码> LIbCP.String 的版本,该图映射了C++ <代码> STD::String < /C> >在<代码> <代码>:


你明白文件的这一部分吗。我还在努力,谢谢。实际上,我成功地传递了这个表后面的字符串。我想你建议使用
libcpp.string
std::string
,比将
bytes
传递给
char*
,然后将返回值(类型为
bytes
)转换为
str
要好吗?我链接的文档页面似乎对
C
char strings的评价很低,尤其是因为Py3使用的是
unicode
。但是什么是最好的可能取决于您在
C++
中对字符串所做的操作。事实上,我正在与一个旧的遗留代码进行交互,我对cython仍然没有什么经验。如果你可以用更合适的方法来回答
libcpp.string
,我可以接受。
fun
返回的内存是使用
malloc
分配的吗?如果是,那么你可能也需要释放它。如果不是,那么这应该是好的。在这个特殊的情况下不是,但它可能是有用的。我怎么做?请随意修改相应的答案。我已经编辑过了,你是怎么做的。如果你想改变它的结构,那么也可以随意改变它