下面是CPP调用python文件源码供参考。
int main(int argc, char *argv[])
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue;
int i;
string pythonFunction = "sample_fun";
string pythonFile = "sample"
string tensoflow_env = "tensorflow_env_path";
wchar *env = Py_DecodeLocal(tensoflow_env,NULL);
Py_SetPythonHome(env);
Py_Initialize();
pName = PyUnicode_DecodeFSDefault(pythonFile.c_str());
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
pFunc = PyObject_GetAttrString(pModule, pythonFunction.c_str());
/* pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
pValue = PyObject_CallObject(pFunc, NULL);
if (pValue != NULL) {
Py_DECREF(pValue);
}
else {
Py_DECREF(pFunc);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failed\n");
return 1;
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else {
PyErr_Print();
fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
return 1;
}
if (Py_FinalizeEx() < 0) {
return 120;
}
return 0;
}
下面是 sample.py 文件供参考。
def sample_fun():
import tensorflow as tf
return 'Success'
问题 :
上面的代码在通过 tensorflow2.0 env 运行时工作正常,但是如果我通过 tensorflow2.2 env 运行相同的代码,那么它在 PYObject_CallObject(pFunc, NULL) 处给出以下异常
错误:Microsoft c++ 异常:pybind11::error_already_set 在内存位置 XXXXXX
任何人都知道上述问题的可能原因是什么?注意:Tensorflow2.2 使用 python 3.7.6 构建,Tensorflow2.0 使用 python 3.7.7 构建