我以学习python&c++混合编程为目的使用opengl写了个项目PythonSTG。 而在开发的时候遇到了很多坑,写篇文章记录下我是如何解决这些问题的。 PythonSTG github链接(欢迎来看下我的项目)
玩家/普通开发者在使用的时候不一定装了python环境,这时候我们需要在安装包里自带python36.dll、python3.dll等动态链接库。(Python3.6为例) 在自带动态链接库后仍然是没有python标准库环境的,然而使用我们python开发环境里的标准库包又过大。可以在python官网下载python embedded版本放到发布文件夹下。 官方下载链接 里下载带 embeddable zip file字样的
在需要调用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);\ }\解析普通元组可以用下列方法
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;