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

mac2024-01-25  46

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

前言项目发布问题多线程下c++调用python方法c++解析Python函数返回的元组

前言

我以学习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;
最新回复(0)