【问题标题】:Strange behavior of extended C++ function扩展 C++ 函数的奇怪行为
【发布时间】:2015-09-12 19:57:31
【问题描述】:

我正在为 C++ 函数 repeating_count::count(string str) 编写 Python 包装器。这个函数的算法并不重要,但它总是返回int。 我的包装器将list[str] 作为输入并返回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 调用该函数时,我抓住了

分段错误(核心转储)

那么,我做错了什么?

调用count()的Python代码片段:

from repeating_count import *
print(count_rep_list(["sdfsf", "sf", "sdfvgsdgsd"]))

【问题讨论】:

  • str 是一个未初始化的指针,您将其传递给 PyArg_Parse
  • @KennyOstrom,非常感谢。我已经更正了代码。

标签: python c++ extending


【解决方案1】:

我解决了我的问题。代码中只是有一个错误。

我不得不使用PyTuble_GetItem(args, 0) 而不是PyList_GetItem(args, 0) 因为args 是一个元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多