如何将Python3中的字符串传递给cythonized C ++函数

时间:2017-03-08 18:09:58

标签: c++ python-3.x cython cythonize

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

1 个答案:

答案 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