从C ++调用Python

我正在尝试从我的主要C ++程序中调用Python脚本中的函数。 python函数接受一个字符串作为参数并且不返回任何内容(ok ..’None’)。 只要前一次调用在再次调用函数之前完成,它就完美地工作(从未想过会那么容易……),否则在pModule = PyImport_Import(pName)处存在访问冲突。

有很多教程如何在C中嵌入python,反之亦然,但我没有发现这个问题。

 int callPython(TCHAR* title){ PyObject *pName, *pModule, *pFunc; PyObject *pArgs, *pValue; Py_Initialize(); pName = PyUnicode_FromString("Main"); /* Name of Pythonfile */ pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule != NULL) { pFunc = PyObject_GetAttrString(pModule, "writeLyricToFile"); /* function name. pFunc is a new reference */ if (pFunc && PyCallable_Check(pFunc)) { pArgs = PyTuple_New(1); pValue = PyUnicode_FromWideChar(title, -1); if (!pValue) { Py_DECREF(pArgs); Py_DECREF(pModule); showErrorBox(_T("pValue is false")); return 1; } PyTuple_SetItem(pArgs, 0, pValue); pValue = PyObject_CallObject(pFunc, pArgs); Py_DECREF(pArgs); if (pValue != NULL) { //worked as it should! Py_DECREF(pValue); } else { Py_DECREF(pFunc); Py_DECREF(pModule); PyErr_Print(); showErrorBox(_T("pValue is null")); return 1; } } else { if (PyErr_Occurred()) PyErr_Print(); showErrorBox(_T("pFunc null or not callable")); return 1; } Py_XDECREF(pFunc); Py_DECREF(pModule); } else { PyErr_Print(); showErrorBox(_T("pModule is null")); return 1; } Py_Finalize(); return 0; } 

当你说“只要在再次调用函数之前完成上一次调用”时,我只能假设你有多个线程从C ++调用到Python。 python不是线程安全的,所以这将失败!

阅读Python手册中的全局解释器锁(GIL)。 也许以下链接将有所帮助:

维基百科上提到了GIL:

谢谢您的帮助!

是的,你是对的,有几个C线程。 从来没有想过我需要用于解释器本身的互斥 – GIL对我来说是一个全新的概念(甚至在整个教程中都没有提及过)。

在阅读了参考文献之后(肯定不是最简单的部分,尽管PyGILState_ *函数简化了整个过程),我添加了一个

 void initPython(){ PyEval_InitThreads(); Py_Initialize(); PyEval_ReleaseLock(); } 

函数正确初始化解释器。 每个线程都创建其数据结构,获取锁并随后将其释放,如参考中所示。

可以正常工作,但是在终止进程之前调用Py_Finalize()时,我会遇到一个段错误…离开它有什么问题吗?