在C ++中嵌入TensorFlow Python程序

时间:2019-06-12 23:01:47

标签: python c++ multithreading tensorflow

我现在很紧张,确实需要帮助。我有一个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;

感谢您的帮助! :)

0 个答案:

没有答案