spring 调用python_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();

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值