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;