如何将字符串从 Python3 传递给 cythonized C++ 函数
How to pass string from Python3 to cythonized C++ function
我想了解如何在 Python3 和 cythonized C++ 函数之间传递字符串值。但是我无法使用 Cython 构建库。
特别是,我不明白如何在source.pyx
中声明字符串return值和字符串参数。使用 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
的版本,它映射 <string>
中定义的 C++ std::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
我想了解如何在 Python3 和 cythonized C++ 函数之间传递字符串值。但是我无法使用 Cython 构建库。
特别是,我不明白如何在source.pyx
中声明字符串return值和字符串参数。使用 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
的版本,它映射 <string>
中定义的 C++ std::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