Ошибка ошибки сегментации во встроенном коде Python в коде C ++ простого модуля Omnet ++ - PullRequest
1 голос
/ 29 мая 2019

Я хочу вызвать функцию Python из кода C ++ в простом модуле OMNeT ++.

Я отлаживал код, используя gdb. Он проходит все линии нормально, но в конце концов ошибка сегментации возникает после Py_Finalize();.

Segmentation fault error

Я обнаружил следующую проблему на GitHub , которая описывает ту же проблему. Но это не помогло мне решить проблему.

double result=0;
// 1) Initialise python interpretator
if (!Py_IsInitialized()) {
    Py_Initialize();
        //Py_AtExit(Py_Finalize);
}
// 2) Initialise python thread mechanism
if (!PyEval_ThreadsInitialized()) {
        PyEval_InitThreads();
        assert(PyEval_ThreadsInitialized());
}

PyGILState_STATE s = PyGILState_Ensure();
PyRun_SimpleString("import sys; sys.path.append('/home/mypath/')");
PyObject *pName = PyUnicode_DecodeFSDefault((char*)"integrationTest");
PyObject* pModule = PyImport_Import(pName);

if (pModule != NULL)
{
    PyObject* pFunction = PyObject_GetAttrString(pModule, (char*)"calculateExecutionTime");
    /// changement will be held in this level Args and function result.
    PyObject* pArgs = PyTuple_Pack(2,PyFloat_FromDouble(2.0),PyFloat_FromDouble(8.0));
    PyObject* pResult = PyObject_CallObject(pFunction, pArgs);
    result = (double)PyFloat_AsDouble(pResult);
    ///////
}
// Clean up
PyGILState_Release(s);
Py_DECREF(pName);
Py_DECREF(pModule);
Py_Finalize();

1 Ответ

0 голосов
/ 30 мая 2019

Проблема возникает после первой инициализации / деинициализации интерпретатора Python. Во время симуляции OmneT ++ происходит инициализация / неинициализация / повторная инициализация / ... интерпретатора Python. Тем не менее, Numpy не поддерживает это;

Итак, я решил эту проблему, инициализировав интерпретатор python только один раз в начале симуляции в методе initialize (). Затем я вызвал Py_Finalize (); в деструкторе.

...