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基础功能实例详解