Python嵌入代码中OMNET++ C++简单代码中的分段错误

2024-09-29 07:30:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从OMNET++简单模块中的C++代码调用Python函数。你知道吗

我用gdb调试了代码。它可以通过所有的线,但在最后 分段错误发生在Py_Finalize();之后。你知道吗

Segmentation fault error

我发现下面的issue on 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();

Tags: 代码pyifsysresultpyobjectdoublepname
1条回答
网友
1楼 · 发布于 2024-09-29 07:30:23

问题发生在python解释器的第一次初始化/取消初始化之后。OmneT++模拟过程中发生的事情是初始化/取消初始化/重新初始化/。。。Python解释器。但是,Numpy不支持这一点

因此,我在initialize()方法中的模拟开始时只初始化了一次python解释器,就解决了这个问题。然后,我在析构函数中调用Py_Finalize()。你知道吗

相关问题 更多 >