簡體   English   中英

python & c-c++擴展模塊案例segmentfault

[英]python & c-c++ extended module case segmentfault

代碼

extern "C" PyObject * test(){
    PyObject *oplist = PyList_New(10000);
    for(uint32_t j = 0; j < 10000; j++){
        PyObject* pTuple = PyTuple_New(3);
        assert(PyTuple_Check(pTuple));
        assert(PyTuple_Size(pTuple) == 3);
        PyTuple_SetItem(pTuple, 0, Py_BuildValue("s", "b"));
        PyTuple_SetItem(pTuple, 1, Py_BuildValue("i", 1)); 
        PyTuple_SetItem(pTuple, 2, Py_BuildValue("s", "a"));
        PyList_SetItem(oplist, j, pTuple);
    }    
    return oplist;
}

蟒蛇代碼

LID = ctypes.CDLL('%s/token2map_lib.so' % '.')
LID.test.restype = py_object
LID.test()

build cmd g++ -fPIC token2map.cpp -I/usr/local/app/service/virtualenvs/NLP/include/python2.7 -shared -o token2map_lib.so我只展示了一部分代碼,請原諒我,總代碼是長

問題:在c++代碼中,這個函數返回res_list很小,一切正常。 永遠,結果集超過 215(j = 215) 個 case segmentfalut。 我找不到問題,希望在座的朋友能給我一些建議,我將不勝感激。

我有辦法解決這個問題

extern "C" PyObject * test(){
    PyGILState_STATE gstate = PyGILState_Ensure();
    PyObject *oplist = PyTuple_New(10000);
    for(int32_t j = 0; j < 10000; j++){
        PyObject * pTuple = PyTuple_New(3);
        assert(PyTuple_Check(pTuple));
        assert(PyTuple_Size(pTuple) == 3);
        PyTuple_SetItem(pTuple, 0, Py_BuildValue("s", "b"));
        PyTuple_SetItem(pTuple, 1, Py_BuildValue("i", 1)); 
        PyTuple_SetItem(pTuple, 2, Py_BuildValue("s", "a"));
        PyTuple_SetItem(oplist, j, pTuple);
    }    
    PyGILState_Release(gstate);
    return oplist;
}

但是有沒有辦法解決這個問題? 我不認為得到 GIL locak 是一個很好的方法

我無法解釋為什么您的代碼會出現段錯誤。 我確實覺得有趣的是,您能夠使用不帶參數的函數構建擴展。 但是,我可以提供構建和工作的代碼:

#define Py_SSIZE_T_CLEAN
#include <Python.h>
#include <inttypes.h>
#ifdef __cplusplus
extern "C" {
#endif

static PyObject *test(PyObject *self, PyObject *ignorethis)
{
    PyObject *oplist = PyList_New(10000);
    for(uint32_t j = 0; j < 10000; ++j){
        PyObject *pTuple = PyTuple_New(3);
        PyTuple_SetItem(pTuple, 0, Py_BuildValue("s", "b"));
        PyTuple_SetItem(pTuple, 1, Py_BuildValue("i", 1));
        PyTuple_SetItem(pTuple, 2, Py_BuildValue("s", "a"));
        PyList_SetItem(oplist, j, pTuple);
    }
    return oplist;
}

static PyMethodDef methods[] = {
    {"test", test, METH_NOARGS, "function given by so"}
};

static PyModuleDef foobar = {
    PyModuleDef_HEAD_INIT,
    "foobar",
    "so question module",
    -1,
    methods
};

PyMODINIT_FUNC PyInit_foobar(void){
    PyObject *module;
    module = PyModule_Create(&foobar);
    return module;
}

#ifdef __cplusplus
}
#endif

您可以使用import foobar加載此模塊,然后使用foobar.test()運行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM