Я пытаюсь взаимодействовать с устаревшим многопоточным приложением Python из какого-то нового кода на C ++, который разрабатывается. Кажется, я не могу заставить вызовы C ++ к Python работать надежно, если код Python запустил поток. В псевдокоде я пытаюсь заставить работать:
Код, который я до сих пор успешно вызывал функцию Python несколько раз из C ++, успешно, но аварийно завершает работу при выходе, а также единственный поток, созданный в Python, кажется, останавливается до того момента, когда программа C ++ завершает работу.
Текущие вызовы, которые я делаю для настройки среды Python:
// Initialize Python environment
Py_Initialize();
// Initialize threading and acquire Python GIL
PyEval_InitThreads();
PyThreadState * mainThreadState = NULL;
// save a pointer to the main PyThreadState object
mainThreadState = PyThreadState_Get();
// release the lock
PyEval_ReleaseLock();
// get the global lock
PyEval_AcquireLock();
// get a reference to the PyInterpreterState
PyInterpreterState* mainInterpreterState = mainThreadState->interp;
// create a thread state object for this thread
PyThreadState* myThreadState = PyThreadState_New(mainInterpreterState);
// free the lock
PyEval_ReleaseLock();
PySys_SetArgv(argc, argv);
Затем функция Python вызывается несколько раз так:
// grab the global interpreter lock
PyEval_AcquireLock();
// swap in my thread state
PyThreadState_Swap(myThreadState);
PyObject* pMod = PyImport_ImportModule(moduleName.c_str());
PyObject* pfn = PyObject_GetAttrString(pMod, fnName.c_str());
// Create the data structure to pass the single C string
PyObject* pargs = Py_BuildValue("(s)", arg.c_str());
PyObject* result = PyEval_CallObject(pfn, pargs);
Py_DECREF(pargs);
Py_DECREF(pfn);
Py_DECREF(pMod);
// clear the thread state
PyThreadState_Swap(NULL);
// release our hold on the global interpreter
PyEval_ReleaseLock();
Единовременный код очистки, вызываемый при выходе из приложения C ++:
PyEval_AcquireLock();
Py_Finalize();
Было бы замечательно, если бы кто-то мог указать мне на некоторый пример кода, который делает то, что я пытаюсь достичь, или мог указать на то, что я делаю неправильно на вышеуказанных шагах?
Задача ещё не решена.
Других решений пока нет …