如何将字符串从 Python3 传递到磁盘化的C++函数
How to pass string from Python3 to cythonized C++ function
我正在尝试了解如何在 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
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- linux 是否"rename"函数调用块,直到复制(当源和目标在不同磁盘中时)完成
- 如何将字符串从 Python3 传递到磁盘化的C++函数
- Windows资源监视器使用哪些Win32函数来检测已终止进程的磁盘和网络活动
- WriteFile函数如何与磁盘上的另一个数据交互