扩展 C++ 函数的奇怪行为
Strange behavior of extended C++ function
我正在为 C++ 函数 repeating_count::count(string str)
编写 Python 包装器。这个函数的算法并不重要,但它总是return int
。
我的包装器得到 list[str]
作为输入和 returns list[int]
。我的包装器代码如下:
PyObject* count_rep_list(PyObject *mod, PyObject *args){
PyObject* inputList = PyList_GetItem(args, 0);
PyObject* outputList = PyList_New(0);
cout << PyList_Size(inputList);
char* str;
for(size_t i = 0; i < PyList_Size(inputList); ++i){
PyObject* list_item = PyList_GetItem(inputList, i);
if(!PyArg_Parse(list_item, "s", &str)){
return NULL;
}
PyList_Append(outputList, PyLong_FromSize_t(repeating_count::count(string(str))));
}
return outputList;
}
然后我用这个功能做了一个python模块:
PyMODINIT_FUNC PyInit_repeating_count() {
static PyMethodDef ModuleMethods[] = {
{"count_rep_list", count_rep_list, METH_VARARGS, "counting repeatings for list of strings"},
{ NULL, NULL, 0, NULL}
};
static PyModuleDef ModuleDef = {
PyModuleDef_HEAD_INIT,
"repeating_count",
"counting repeatings",
-1, ModuleMethods,
NULL, NULL, NULL, NULL
};
PyObject * module = PyModule_Create(&ModuleDef);
return module;
}
我在 .so
文件中成功编译并链接了这个模块。但是当我想从 Python 3 调用函数时,我发现
Segmentation fault (core dumped)
所以,我做错了什么?
调用count()
的Python代码片段:
from repeating_count import *
print(count_rep_list(["sdfsf", "sf", "sdfvgsdgsd"]))
我解决了我的问题。只是代码中有一个错误。
我不得不使用 PyTuble_GetItem(args, 0)
而不是 PyList_GetItem(args, 0)
因为 args
是一个元组。
我正在为 C++ 函数 repeating_count::count(string str)
编写 Python 包装器。这个函数的算法并不重要,但它总是return int
。
我的包装器得到 list[str]
作为输入和 returns list[int]
。我的包装器代码如下:
PyObject* count_rep_list(PyObject *mod, PyObject *args){
PyObject* inputList = PyList_GetItem(args, 0);
PyObject* outputList = PyList_New(0);
cout << PyList_Size(inputList);
char* str;
for(size_t i = 0; i < PyList_Size(inputList); ++i){
PyObject* list_item = PyList_GetItem(inputList, i);
if(!PyArg_Parse(list_item, "s", &str)){
return NULL;
}
PyList_Append(outputList, PyLong_FromSize_t(repeating_count::count(string(str))));
}
return outputList;
}
然后我用这个功能做了一个python模块:
PyMODINIT_FUNC PyInit_repeating_count() {
static PyMethodDef ModuleMethods[] = {
{"count_rep_list", count_rep_list, METH_VARARGS, "counting repeatings for list of strings"},
{ NULL, NULL, 0, NULL}
};
static PyModuleDef ModuleDef = {
PyModuleDef_HEAD_INIT,
"repeating_count",
"counting repeatings",
-1, ModuleMethods,
NULL, NULL, NULL, NULL
};
PyObject * module = PyModule_Create(&ModuleDef);
return module;
}
我在 .so
文件中成功编译并链接了这个模块。但是当我想从 Python 3 调用函数时,我发现
Segmentation fault (core dumped)
所以,我做错了什么?
调用count()
的Python代码片段:
from repeating_count import *
print(count_rep_list(["sdfsf", "sf", "sdfvgsdgsd"]))
我解决了我的问题。只是代码中有一个错误。
我不得不使用 PyTuble_GetItem(args, 0)
而不是 PyList_GetItem(args, 0)
因为 args
是一个元组。