1.导入模块失败 “Python get module failed.”
解决方案:
- 将整个项目设计到的路径都添加进去
- 路径 分割符为 “/”
- 路径不能含有中文
- 项目导包涉及到的路径文件夹 也加入 sys.path
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/detector')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/deep_sort')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/utils')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/detector/Yolov4_tiny')");
2. 线程报错!
解决方案:
去掉 argparse 不要引用。
涉及到 路径问题,改为绝对路径!!!(本人的好几次报错都是因为项目中调用的不同py文件 路径引发的问题)
3. Python 环境初始化报错!
修改属性表
常规 -> SDL检测 改为 =否
语言-> 符合模式 改为 =否
4. object.h 文件 报错 加入‘;’?
将源文件的 443行 注释掉
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
新增:
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
#undef slots // 这里取消slots宏定义
PyType_Slot *slots;/* terminated by slot==0. */
#define slots Q_SLOTS // 这里恢复slots宏定义与QT中QObjectDefs.h中一致
} PyType_Spec;
如下图:
4.完整测试代码
项目结构
完整代码:
#include <stdlib.h>
#include <iostream>
#include "Python.h"
using namespace std;
int main(int argc, int* argv[])
{
//初始化Python环境
Py_SetPythonHome(L"F:\\Anaconda\\envs\\mytorch");
Py_Initialize();
PyRun_SimpleString("import sys");
//添加Insert模块路径
//PyRun_SimpleString(chdir_cmd.c_str());
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/detector')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/deep_sort')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/utils')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/detector/Yolov4_tiny')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/deep')");
PyRun_SimpleString("sys.path.append('B:/road/pytorch-yolov4-tiny-deepsort/sort')");
PyObject * pFunc = NULL;
//导入模块
PyObject* pModule = PyImport_ImportModule("yolov4_deepsort");//py文件名
if (!pModule)
{
cout << "Python get module failed." << endl;
return 0;
}
cout << "Python get module succeed." << endl;
pFunc = PyObject_GetAttrString(pModule, "run"); //函数名
PyEval_CallObject(pFunc, NULL);
Py_Finalize();
system("pause");
return 0;
}
5.成功!