c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码。
编写makefile文件,首先要添加包含路径:
inc_path += c:/Python35/include
然后添加链接参数:
ld_flag += c:/Python35/libs/libpython35.a
在源文件中添加头文件引用:
#include "Python.h"
Python解释器需要进行初始化,完成任务后需要终止:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void start() { int r=Py_IsInitialized(); //1为已经初始化了 if (r==0) { //Py_SetPythonHome(L"C:\\Python35"); Py_Initialize(); //初始化 p_main_Module =PyImport_ImportModule( "__main__" ); if (!p_main_Module) { throw "" ; } } } void end() { Py_Finalize(); //清理 } |
程序部署时可以将c:\Python35\lib目录复制到执行程序路径下,或者通过Py_SetPythonHome(L"C:\\Python35");设置Python的安装目录。
C++调用Python的基本需求:
1、运行Python指令
1
2
|
PyRun_SimpleString( "print(os.getcwd(),a)" ); pyext.eval(R "(a+='qwer')" ); |
2、加载Python模块
1
2
|
PyObject * pModule =PyImport_ImportModule( "tp" ); //test:Python文件名,若脚本有错则返回空 PyRun_SimpleString( "import os" ); |
3、给Python的变量赋值
对于数值,使用Py_BuildValue:
1
2
3
4
5
6
7
8
9
10
11
12
|
Py_BuildValue( "" ) None Py_BuildValue( "i" , 123) 123 Py_BuildValue( "iii" , 123, 456, 789) (123, 456, 789) Py_BuildValue( "s" , "hello" ) 'hello' Py_BuildValue( "ss" , "hello" , "world" ) ( 'hello' , 'world' ) Py_BuildValue( "s#" , "hello" , 4) 'hell' Py_BuildValue( "()" ) () Py_BuildValue( "(i)" , 123) (123,) Py_BuildValue( "(ii)" , 123, 456) (123, 456) Py_BuildValue( "(i,i)" , 123, 456) (123, 456) Py_BuildValue( "[i,i]" , 123, 456) [123, 456] Py_BuildValue( "{s:i,s:i}" , "abc" , 123, "def" , 456) { 'abc' : 123, 'def' : 456} |
对于其他数据结构,使用相应的函数设置,例如:
1
2
3
4
5
|
PyObject *pArgs = PyTuple_New(1); PyObject *pDict = PyDict_New(); //创建字典类型变量 PyDict_SetItemString(pDict, "Name" , Py_BuildValue( "s" , "WangYao" )); //往字典类型变量中填充数据 PyDict_SetItemString(pDict, "Age" , Py_BuildValue( "i" , 25)); //往字典类型变量中填充数据 PyTuple_SetItem(pArgs, 0, pDict); //0---序号 将字典类型变量添加到参数元组中 |
构造好对象以后,通过PyObject_SetAttrString来设置进入Python中:
1
2
|
PyObject *ps=PyUnicode_DecodeUTF8(val, strlen (val), "ignore" ); //构造了一个对象 PyObject_SetAttrString(p_main_Module,key,ps); //设置 |
4、获取Python变量的值
首先取得变量的指针,然后通过PyArg_Parse解析
1
2
3
4
5
6
|
pModule =PyImport_ImportModule( "__main__" ); pReturn = PyObject_GetAttrString(pModule, "a" ); //可以获得全局变量 int size = PyDict_Size(pReturn); PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age" ); int newAge; PyArg_Parse(pNewAge, "i" , &newAge); |
对于元组的解析:
1
2
3
4
5
6
7
8
|
int ok; ok = PyArg_ParseTuple(args, "s" , &s); //Python call: f('whoops!') ok = PyArg_ParseTuple(args, "lls" , &k, &l, &s); //Python call: f(1, 2,'three') ok = PyArg_ParseTuple(args, "(ii)s#" , &i, &j, &s, &size); //Python call: f((1, 2), 'three') ok = PyArg_ParseTuple(args, "s|si" , &file, &mode, &bufsize); //Python calls: //f('spam') //f('spam', 'w') //f('spam', 'wb', 100000) |
5、调用Python函数
1
2
|
PyObject * pfun=PyObject_GetAttrString(pModule, "testdict" ); //testdict:Python文件中的函数名 PyObject *pReturn = PyEval_CallObject(pfun, pArgs); //调用函数 |
6、设置函数让Python调用
首先定义c函数,然后声明方法列表,然后声明模块,然后增加这个模块,最后调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
static int numargs=1890; static PyObject* emb_numargs(PyObject *self, PyObject *args) //C函数 { if (!PyArg_ParseTuple(args, ":numargs" )) return NULL; return PyLong_FromLong(numargs); } static PyMethodDef EmbMethods[] = { //方法列表 { "numargs" , emb_numargs, METH_VARARGS, "Return the number of arguments received by the process." }, {NULL, NULL, 0, NULL} }; static PyModuleDef EmbModule = { //模块声明 PyModuleDef_HEAD_INIT, "emb" , NULL, -1, EmbMethods, NULL, NULL, NULL, NULL }; static PyObject* PyInit_emb( void ) //模块初始化函数 { return PyModule_Create(&EmbModule); } //增加模块: PyImport_AppendInittab( "emb" , &PyInit_emb); //增加一个模块 |
Python部分代码:
1
2
|
import emb print( "Number of arguments" , emb.numargs()) |
以上所述是小编给大家介绍的C++调用Python基础功能实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/yangzifb/p/6738191.html?utm_source=tuicool&utm_medium=referral