c++调用Python基础功能实例详解

  

c++调用Python首先安装Python,以这个主题为例,Python路径为:c: \ Python35 \,通过mingw编译c++代码。

  

编写makefile文件,首先要添加包含路径:

  

inc_path +=c:/Python35包括

  

然后添加链接参数:

  

ld_flag +=c:/Python35/libs/libpython35.a

  

在源文件中添加头文件引用:

  

#包括“Python。h”
  

  

Python解释器需要进行初始化,完成任务后需要终止:

        无效的start ()   {   int r=Py_IsInitialized ();//1为已经初始化了   如果(r==0)   {//Py_SetPythonHome (L C: \ \ Python35);   Py_Initialize ();//初始化   p_main_Module=PyImport_ImportModule (“__main__”);   如果(! p_main_Module)   {   把“”;   }   }   }   空白结束()   {   Py_Finalize ();//清理   }      

程序部署时可以将c: \ Python35 \ lib目录复制到执行程序路径下,或者通过Py_SetPythonHome (L c: \ \ Python35);设置Python的安装目录。

  

  

<强> 1,运行Python指令

        PyRun_SimpleString(“打印(os.getcwd ()) ");   pyext.eval (R”(+=qwer)”);      

<强> 2,加载Python模块

        PyObject * pModule=PyImport_ImportModule (tp);//测试:Python文件名,若脚本有错则返回空   PyRun_SimpleString(“进口操作系统”);      

<强> 3,给Python的变量赋值

  

对于数值,使用Py_BuildValue:

        Py_BuildValue (" ")   Py_BuildValue(“我”,123年)123   Py_BuildValue(“三世”,123年、456年、789年)(123、456、789)   Py_BuildValue (“s”、“你好”)“你好”   Py_BuildValue(“党卫军”、“你好”、“世界”)(“你好”、“世界”)   Py_BuildValue(“#”,“你好”,4)“地狱”   Py_BuildValue (()) ()   Py_BuildValue(“(我)”,123年)(123年)   Py_BuildValue (“(2)",123年,456年)(123、456)   Py_BuildValue(“(我)",123年,456年)(123、456)   Py_BuildValue(“[我]”,123年,456年)(123、456)   Py_BuildValue(“{我,年代:我}”,“abc”, 123年,“def”, 456年){“abc”: 123年,“def”: 456}      

对于其他数据结构,使用相应的函数设置,例如:

        PyObject * pArgs=PyTuple_New (1);   PyObject * pDict=PyDict_New ();//创建字典类型变量   PyDict_SetItemString (pDict,“名字”,Py_BuildValue (“s”、“WangYao”));//往字典类型变量中填充数据   PyDict_SetItemString (pDict,“年龄”,Py_BuildValue(“我”,25岁));//往字典类型变量中填充数据   PyTuple_SetItem (pArgs 0 pDict);//0 - - -序号将字典类型变量添加到参数元组中      

构造好对象以后,通过PyObject_SetAttrString来设置进入Python中:

        PyObject * ps=PyUnicode_DecodeUTF8 (val strlen (val),“忽略”);//构造了一个对象   PyObject_SetAttrString (p_main_Module、关键、ps);//设置      

<强> 4,获取Python变量的值

  

首先取得变量的指针,然后通过PyArg_Parse解析

        pModule=PyImport_ImportModule (“__main__”);   pReturn=PyObject_GetAttrString (pModule,“a”);//可以获得全局变量   int大?PyDict_Size (pReturn);   PyObject * pNewAge=PyDict_GetItemString (pReturn,“年龄”);   int新时代;   PyArg_Parse (pNewAge,“我”和新时代);之前      

对于元组的解析:

        int好;   好吧=PyArg_ParseTuple (args,“s”,和s);//Python调用:f(哎呀!)   好的=PyArg_ParseTuple (args,“那”,和k, l和s);//Python调用:f (1 2 3)   好的=PyArg_ParseTuple (args”,(2) #”,和我,和j,年代,和大小);//Python调用:f ((1、2)、3)   好吧=PyArg_ParseTuple (args, | si”,和文件,和模式,及bufsize);//Python调用://f(“垃圾邮件”)//f(“垃圾邮件”,“w”)//f(“垃圾邮件”,“白平衡”,100000年)      

<强> 5,调用Python函数

        PyObject * pfun=PyObject_GetAttrString (pModule testdict);//testdict: Python文件中的函数名   PyObject * pReturn=PyEval_CallObject (pfun pArgs);//调用函数      

, <强> 6,设置函数让Python调用

  

首先定义c函数,然后声明方法列表,然后声明模块,然后增加这个模块,最后调用

        静态int numargs=1890;   静态PyObject * emb_numargs (PyObject *自我,PyObject * args)//C函数   {   如果(!PyArg_ParseTuple (args ": numargs "))   返回NULL;   返回PyLong_FromLong (numargs);   }   静态PyMethodDef EmbMethods[]={//方法列表   {“numargs emb_numargs METH_VARARGS,   “回归参数的数量接收的过程。”},   零}{零,零,0,   };   静态PyModuleDef EmbModule={//模块声明   PyModuleDef_HEAD_INIT,“循证”,NULL, 1, EmbMethods,   空,空,空,空   };   静态PyObject * PyInit_emb(空白)//模块初始化函数   {   返回PyModule_Create(和EmbModule);   }//增加模块:   PyImport_AppendInittab(“循证”,和PyInit_emb);//增加一个模块

c++调用Python基础功能实例详解