gpt4 book ai didi

c++ - 从 C++ 调用 Python

转载 作者:太空狗 更新时间:2023-10-29 21:47:59 31 4
gpt4 key购买 nike

我正在尝试从我的主 C++ 程序调用 Python 脚本中的函数。 python 函数将一个字符串作为参数并且不返回任何内容(好的..'无')。它工作得非常好(从来没有想过它会那么容易..)只要在再次调用函数之前完成先前的调用,否则在 pModule = PyImport_Import(pName) 处存在访问冲突.

有很多教程如何将 python 嵌入 C 中,反之亦然,但我没有发现任何关于该问题的内容。

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++ - 从 C++ 调用 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1417473/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com