C++以及MFC调用python代码(对接)
- C++调用python环境配置
- 找到python安装目录,找到安装目录下的include和libs文件。
图1 python的库的配置
- 将这两个文件拷贝到自己代码根目录下面。
图2 python环境配置
- 然后进行代码的配置,先拷贝一份python37.lib文件,命名为python37_d.lib。这样拷贝的话,python37_d.lib就是debug版本,python37.lib是release版本。
图3 python环境配置
- 环境的配置
配置属性---》包含目录---》include文件所在位置
配置属性---》引用目录---》libs文件夹所在位置
配置属性---》 库目录---》libs文件夹所在位置
图4 VC++目录
链接器---》输入---》附加依赖项 添加python37_d.lib
图5 附加依赖项
测试代码如下所示:
Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
Py_SetPythonHome(L"D:\\a");
if (!Py_IsInitialized())
MessageBox(_T("初始化失败!"), _T("警告"), MB_OK);
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('D://')");
PyRun_SimpleString("sys.path.append('Dlls/')");
PyRun_SimpleString("sys.path.append('os.getcwd()')");
PyRun_SimpleString("sys.path.append('./')");
PyRun_SimpleString("sys.path.append('C:\Users\10730\Desktop\TEST_PYTHON\x64\Debug')",NULL);
PyRun_SimpleString("print(sys.path)");
PyObject*ArgArray1 = PyTuple_New(0);
PyObject * pModule = PyImport_ImportModule("detect"); //文件
if (!pModule){
PyErr_Print();
MessageBox(_T("Cannot find WrittennPython.py!"), _T("警告"), MB_OK);
return;
}
PyObject * pFunc = NULL;
pFunc = PyObject_GetAttrString(pModule, "inference");
const char *r = "5.jpg";
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, Py_BuildValue("s", r));
char* a;
PyObject* pRet = PyEval_CallObject(pFunc, args);
PyArg_Parse(pRet, "s", &a);//转换返回类型
Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
- MFC代码运行时遇到的问题
在MFC调用python代码时,调用第三方库会出现调用函数出错的问题。需要改动python里面的源文件。找到python中keras的安装路径中的backend文件夹(如D:\python\Lib\site-packages\keras\backend),然后打开load_backend,打开load_backend.py文件,把sys.stderr.write(‘Using TensorFlow backend.\n’)这句注释掉。
图6 修改python文件
- C++多线程与python调用
C++多线程调用python时,当线程取得了python的解释器以后,主线程再次申请python解释器占有权失败,导致调用出错。(未解决)
附录
1、C++中调用python代码
博客地址:https://blog.youkuaiyun.com/i6223671/article/details/99832186
环境配置:包含文件、库文件、引用文件配置
链接器中的附加依赖项 添加python37_d.lib
(注意python37_d.lib是不存在的,需要将python37.lib复制然后重命名就OK)
2、MFC调用python代码出错
博客地址:https://blog.youkuaiyun.com/Jonh_/article/details/111028333