我现在很紧张,确实需要帮助。我有一个Python3.6程序,可以导入csv,tensorflow,numpy和“从tensorflow导入keras”。该程序(我无法发布)使用Estimators及其评估和预测方法,该方法利用了多个线程。
我正在尝试将Python嵌入C ++程序,然后在单线程代码的不同点多次调用提到的脚本。我可以运行Python程序,但是调用Py_Finalize();
时会出现问题,这会导致此错误:
在以下情况中忽略了异常:追溯(最近一次调用为last): _shutdown中的文件“ /usr/lib/python3.6/threading.py”,行1289 断言tlock.locked()
SystemError :(内置方法已将_thread.lock对象锁定在0x7fa340764f08处)返回了带有错误集的结果
单步执行代码,我注意到当PyRun_File()
返回时,我的单线程C ++程序添加了大约10个与TensorFlow相关的线程。这是我的C ++代码中所有嵌入的python逻辑,其中包括我尝试过/陷入困境的代码的注释。
void run_python_script(string mode, string model, std::vector<int>* y_test = nullptr) {
const char* SCRIPT_PATH = "../PATH";
/* Setup embedded Python*/
Py_SetProgramName(Py_DecodeLocale(SCRIPT_PATH, NULL));
Py_Initialize();
PyEval_InitThreads();
// Py_DECREF(PyImport_ImportModule("tensorflow"));
// PyThreadState* threadState = PyEval_SaveThread();
// PyGILState_STATE gstate = PyGILState_Ensure();
// PyObject* pGlobals = PyDict_New();
// PyDict_SetItemString(pGlobals, "__builtins__", PyEval_GetBuiltins());
PyObject* m_pMainModule = PyImport_AddModule("__main__");
PyObject* pGlobals = PyModule_GetDict(m_pMainModule);
const wchar_t *script_args[] = { L"REMOVED FROM SNIPPET", NULL };
const wchar_t **_argv = script_args;
int _argc = sizeof(script_args) / sizeof(script_args[0]) - 1;
PySys_SetArgv(_argc, const_cast<wchar_t **>(_argv));
FILE *file = _Py_fopen(SCRIPT_PATH, "r+");
if (file != NULL) {
cout << "Running script..." << endl;
PyRun_File(file, SCRIPT_PATH, Py_file_input, pGlobals, pGlobals);
assert(!PyErr_Occurred());
} else
cerr << "Couldn't find a python script to run";
fclose(file);
// PyGILState_Release(gstate);
// PyEval_RestoreThread(threadState);
Py_Finalize(); //@TODO WHY DOES PROGRAM CRASH HERE ON SCRIPT COMPLETION
/* End embedded Python*/
cout << "Script and file closed." << endl;
感谢您的帮助! :)