VC 调用 Python
//file:py.h
BOOL InitPython();
BOOL ClosePython();
========================
//file:py.cpp
#include "stdafx.h"
#include "py.h"
#define MS_NO_COREDLL
//or user this
//#define Py_NO_ENABLE_SHARED
#include "python.h"
#pragma comment(lib, "python27.lib")
BOOL InitPython()
{
Py_Initialize();
if(!Py_IsInitialized())
{
AfxMessageBox("Python Initialize failed.\n");
return FALSE;
}
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("google"); //调用的文件名
pFunc= PyObject_GetAttrString(pModule, "main"); //调用的函数名
PyObject *arg;
arg = Py_BuildValue("(s)", "look"); //构造参数,关键字为“look”
PyEval_CallObject(pFunc, arg); //调用函数
return TRUE;
}
BOOL ClosePython()
{
Py_Finalize();
return TRUE;
}
/*
1.相应的include和lib路径加入附加库:Python/include,Python/libs"加入附加库路径
2.然后在调用python的cpp头中加入#include "python.h"
2.调用Py_Initialize初始化python解析器环境
3.在c中,python所有对象都是PyObject,常用PyObject *
4.要把python中的数据类型转化成C中的数据类型,才能在C中使用
同样,返回给python的数据结构也要转成PyObject才能在python中使用(一般返回PyObject*)
5.使用Py_IsInitialized判断python解析器环境是否初始化成功
6.用PyRun_SimpleString执行python命令行,如:
PyRun_SimpleString("import sys")
返回0表示执行成功
7.PyObject pObj = PyInitModel("test2",NoticeFunc)等于把NoticeFunc对应的"函数映射数组"映射到python的test2模块中,返回模块地址
为NULL表示映射失败
NoticeFunc定义为一个结构体数组:
PyMethodDef NoticeFunc[] = { {"MaxP",MaxC,METH_VARARGS,"Maxof two args"}, ....... }
其中MaxP是python中函数名,MaxC是c中回调函数名(实际调用的是它)。
METH_VARARGS是参数传递方式,表示通过元组传递参数,METH_KEYWORD表示通过字典传递参数
映射成功后,我们用:
PyRun_SimpleString("import test2");
PyRun_SimpleString("print test2.MaxP(1,3)");
可以执行MaxP函数,表示test2已经植入解析器中
8.Py_BuildValue("i",2003)把2003转化成python中的数据类型,返回一个PyObject*
可用PyInt_Check检查它是否已经转化成了Python中的int
9.C中每产生一个PyObject,此对象的引数就加1,此对象的引数为0时,解析器会释放内存
可用Py_DECREF()将一个对象的引数减一
如果一个Python对象是返回到Python解析器里去,就不要调用Py_DECREF了
如果是Python返回给C使用,则用完后要用此宏自减引用数
10.返回Py_None时要先自加一次:
Py_INCREF(Py_None);
return Py_None;
如果不自加,解析器对Py_None对象的引数为0(实际是1),则Py_None返回给Python解析器后用完不会释放。
11.用PyArg_ParseTuple(argvs,"ii",&a,&b)把pyton的元组解析成两个整数。
12. 清除Python解析环境Py_Finalize();
*/
posted on 2014-04-27 16:48 SpringStudio 阅读(1703) 评论(0) 编辑 收藏 举报