成功解决! C++ 调用 python 问题解决方案 ystemError: <built-in method locked of _thread.lock Python get module fa

本文详细介绍了Python中遇到的模块导入失败、线程错误、环境初始化问题以及object.h文件错误的解决方案。通过调整sys.path、避免引用argparse、修改属性表,并提供了一段包含完整代码的示例,展示了如何正确配置路径和导入模块以确保项目顺利运行。
摘要由CSDN通过智能技术生成

1.导入模块失败 “Python get module failed.”

解决方案:

  1. 将整个项目设计到的路径都添加进去
  2. 路径 分割符为 “/”
  3. 路径不能含有中文
  4. 项目导包涉及到的路径文件夹 也加入 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.成功!

在这里插入图片描述
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值