2015-09-12 3 views
0

Я пишу обертку Python для функции C++ repeating_count::count(string str). Алгоритм этой функции не важен, но он всегда возвращает int. Моя обертка получает list[str] как входной сигнал и возвращает list[int]. Код моей обертки ниже:Странное поведение расширенной функции C++

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; 
} 

Затем я сделал модуль питона с помощью этой функции:

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, я ловлю

неисправностей Сегментация (ядро сбрасывали)

Итак, что я делаю не так?

фрагмент кода Python для вызова count():

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

str - это унифицированный указатель, который вы передаете PyArg_Parse –

+0

@KennyOstrom, спасибо большое. Я исправил код. – VeLKerr

ответ

0

я решить мою проблему. Произошла ошибка в коде.

Мне пришлось использовать PyTuble_GetItem(args, 0) вместо PyList_GetItem(args, 0) beacuse args является кортежем.