python c++ 混合编程 开发掉坑日志

前言

我以学习python&c++混合编程为目的使用opengl写了个项目PythonSTG。
而在开发的时候遇到了很多坑,写篇文章记录下我是如何解决这些问题的。
PythonSTG github链接(欢迎来看下我的项目)

项目发布问题

  玩家/普通开发者在使用的时候不一定装了python环境,这时候我们需要在安装包里自带python36.dll、python3.dll等动态链接库。(Python3.6为例)
  在自带动态链接库后仍然是没有python标准库环境的,然而使用我们python开发环境里的标准库包又过大。可以在python官网下载python embedded版本放到发布文件夹下。
官方下载链接 里下载带 embeddable zip file字样的
在这里插入图片描述

多线程下c++调用python方法

在需要调用python方法时就先使用MultiThreadDefine获得GIL
调用完毕后使用MultiThreadDefineEnd释放GIL

//初始化加上这些
	PyEval_InitThreads();
	int nInit = PyEval_ThreadsInitialized();
	if (nInit)
	{
		PyEval_SaveThread();
	}
#define MultiThreadDefine \
int nHold = PyGILState_Check(); \
PyGILState_STATE gstate; \
if (!nHold) \
{ \
gstate = PyGILState_Ensure(); \
} \
Py_BEGIN_ALLOW_THREADS;\
Py_BLOCK_THREADS;\


#define MultiThreadDefineEnd \
Py_UNBLOCK_THREADS;\
Py_END_ALLOW_THREADS;\
if (!nHold)\
{\
	PyGILState_Release(gstate);\
}\


c++解析Python函数返回的元组

解析普通元组可以用下列方法

const char* text1;int data, data2;
PyArg_ParseTuple(returnValue, "si|i", &text1, &data, &data2);//si指必定返回一个字符串类型数据与一个整形数据,|i为可能返回一个整形数据

而元组嵌套元组可以这样

const char* text1;int data, data2;
PyArg_ParseTuple(returnValue, "s(ii)", &text1, &data, &data2);//data1与data2为子元组

python里的boolean类型也是能返回来的

int boolTemp; bool value;
PyArg_Parse(returnValue, "p", &boolTemp);
value = boolTemp;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值