4

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

1 回答 1

4

除了原始代码中的错误之外,我还设法使其与以下内容一起工作source.pyxbytesPython3 和char*C++ 中的类型之间的转换):

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

如果内存是使用 inside 分配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映射 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
于 2017-03-09T09:36:45.977 回答