Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中python嵌入代码中的分段错误+;Omnet的代码++;简单模块 我想在OMNET++简单模块中调用C++代码中的Python函数。p>_Python_C++_Python 3.x_Omnet++_Python C Api - Fatal编程技术网

C+中python嵌入代码中的分段错误+;Omnet的代码++;简单模块 我想在OMNET++简单模块中调用C++代码中的Python函数。p>

C+中python嵌入代码中的分段错误+;Omnet的代码++;简单模块 我想在OMNET++简单模块中调用C++代码中的Python函数。p>,python,c++,python-3.x,omnet++,python-c-api,Python,C++,Python 3.x,Omnet++,Python C Api,我用gdb调试了代码。它很好地通过了所有的线,但在最后 Py_Finalize()之后出现分段错误 我发现下面描述了同样的问题。 但这并没有帮助我解决问题 double result=0; //1)初始化python解释程序 如果(!Py_已初始化()){ Py_初始化(); //Py_AtExit(Py_Finalize); } //2)初始化python线程机制 如果(!PyEval_ThreadsInitialized()){ PyEval_InitThreads(); 断言(PyEva

我用gdb调试了代码。它很好地通过了所有的线,但在最后
Py_Finalize()之后出现分段错误

我发现下面描述了同样的问题。 但这并没有帮助我解决问题

double result=0;
//1)初始化python解释程序
如果(!Py_已初始化()){
Py_初始化();
//Py_AtExit(Py_Finalize);
}
//2)初始化python线程机制
如果(!PyEval_ThreadsInitialized()){
PyEval_InitThreads();
断言(PyEval_ThreadsInitialized());
}
PyGILState_STATE s=PyGILState_sure();
PyRun_SimpleString(“import sys;sys.path.append('/home/mypath/'));
PyObject*pName=PyUnicode_DecodeFSDefault((char*)“集成测试”);
PyObject*pModule=PyImport\u Import(pName);
if(pModule!=NULL)
{
PyObject*pFunction=PyObject_GetAttrString(pModule,(char*)“calculateExecutionTime”);
///更改将保留在此级别参数和函数结果中。
PyObject*pArgs=PyTuple_Pack(2,PyFloat_fromdool(2.0),PyFloat_fromdool(8.0));
PyObject*preslt=PyObject\u CallObject(pFunction,pArgs);
结果=(双)PyFloat\u AsDouble(预值);
///////
}
//清理
Pygilu州发布;
Py_DECREF(pName);
Py_DECREF(pModule);
Py_Finalize();

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


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

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


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

PyObject_GetAttrString(pModule(char*)“calculateExecutionTime”)不应该是合法的。您的真实代码中是否有逗号,或者编译器是否接受了真正奇怪的东西?此外,您没有检查
NULL
的返回值(在
PyObject\u CallObject
调用中尤其重要,在调用中,您忽略引发的任何异常,并试图将可能的
NULL
返回解释为指向
PyFloat
的合法指针)或其他错误返回(例如,
PyFloat\u AsDouble
返回
-1.0
,并在失败时设置异常)。其他问题:在释放GIL后,您将
Py_DECREF
ing。GIL的主要目的是保护引用计数操作;如果您不持有GIL,则不允许以任何方式修改引用计数。诚然,如果不涉及线程,则不太可能出现问题,但这只是另一个可能的问题源lems.My real code在PyObject_GetAttrString(pModule,(char*)“calculateExecutionTime”);中包含一个逗号。我将检查返回值。感谢您的评论。
PyObject_GetAttrString(pModule(char*)“calculateExecutionTime”)
不应该是合法的。您的真实代码中是否有逗号,或者编译器是否接受了真正奇怪的东西?此外,您没有检查返回值是否为
NULL
(在调用
PyObject\u CallObject
时尤其重要,此时您将忽略引发的任何异常,并尝试将可能的
NULL
返回解释为指向
PyFloat
的合法指针)或其他错误返回(例如
PyFloat\u AsDouble
返回
-1.0
并在失败时设置异常)。其他问题:在释放GIL后,您将
Py_DECREF
ing。GIL的主要目的是保护引用计数操作;如果您不持有GIL,则不允许以任何方式修改引用计数。诚然,如果不涉及线程,则不太可能出现问题,但这只是另一个可能的问题源lems。我的真实代码在PyObject_GetAttrString(pModule,(char*)“calculateExecutionTime”);中包含一个逗号。我将检查我的返回值。谢谢你的评论。好的。但是在你的问题中没有线索表明你可能多次初始化和完成Python(以及你链接到的github问题,你说“没有帮助”实际上说这不受支持)请阅读下一次请求并跟随它的帮助,没错,因为我在特定的OMNET++模拟中使用Python嵌入代码。它不是经典C++程序,它是由模拟事件控制的,之后我理解了这个问题,然后GITHUB链接有帮助。起初,我不知道PYT。尊敬的解释器机制。谢谢你的链接,我下次会关注它。好的。但是你的问题中没有任何线索表明你可能多次初始化和终结Python(你链接到的github问题,你说“没有帮助”,实际上说这不受支持)请阅读下一次请求并跟随它的帮助,没错,因为我在特定的OMNET++模拟中使用Python嵌入代码。它不是经典C++程序,它是由模拟事件控制的,之后我理解了这个问题,然后GITHUB链接有帮助。起初,我不知道PYT。尊敬的翻译机制。谢谢你的链接,我下次会关注它。