c++函数:
代码: 全选
#include <python2.6/Python.h>
#include <iostream>
#include "header/callpython.h" //这是一个自定义头文件,是下列函数的声明
using namespace std;
//几个产生python函数参数的函数
PyObject* create_para(int data)
{
Py_Initialize();
PyObject *pParm;
pParm=PyTuple_New(1);
PyTuple_SetItem(pParm,0,Py_BuildValue("i",data));
return pParm;
}
PyObject* create_para(int nums,int data[])
{
Py_Initialize();//要初始化python函数才能使用相关的函数
PyObject *pParm;
pParm=PyTuple_New(nums);
int i=0;
PyTuple_SetItem(pParm,0,Py_BuildValue("i",data[0]));
for(;i<nums;i++)
{
PyTuple_SetItem(pParm,i,Py_BuildValue("i",data[i]));
}
return pParm;
}
PyObject* create_para(PyObject *p)
{
Py_Initialize();
PyObject *pParm;
pParm=PyTuple_New(1);
PyTuple_SetItem(pParm,0,Py_BuildValue("o",p));
return pParm;
}
PyObject* create_para(int nums,char* data[])
{
Py_Initialize();
PyObject *pParm;
pParm=PyTuple_New(nums);
int i=0;
for(;i<nums;i++)
{
PyTuple_SetItem(pParm,i,Py_BuildValue("s",data[i]));
}
return pParm;
}
//运行几个python单句,事实上,我可通过这个函数来授权
int runpy(int cnt,char* str[])
{
Py_Initialize();
if(!Py_IsInitialized())
{
cout<<"初始化失败!"<<endl;
return -1;
}
for(int i=0;i<cnt;i++)
PyRun_SimpleString(str[i]);
return 0;
}
//调用python 函数的函数
int callpy(int flag,char *name,char* funcName,PyObject* para,struct result_py &py_return)
{
PyObject *modelname,*model,*dict,*func,*pRetVal;
Py_Initialize();//初始化python
if(!Py_IsInitialized())
{
cout<<"初始化失败!"<<endl;
return -1;
}
//导入sys模块,
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./wbAPI')"); //这是我放自己写的模块的路径
PyRun_SimpleString("sys.path.append('./pymodule')"); //这是新浪微波SDK的路径
//导入python模块
modelname=PyString_FromString(name);
model=PyImport_Import(modelname);
if(!model)
{
cout<<"找不到模块"<<name<<endl;
return -1;
}
dict=PyModule_GetDict(model);
if(!dict)
{
cout<<"获取字典失败!\n";
return -1;
}
func=PyDict_GetItemString(dict,funcName);
if(!func||!PyCallable_Check(func))
{
cout<<"函数无效"<<endl;
return -1;
}
pRetVal=PyEval_CallObject(func,para);
//结构体result_py用来接受调用py函数的返回值,在头文件callpython中定义
//flag为返回值类型的标志,在callpython定义的宏
if(flag==1) //返回字符串
{
PyArg_Parse(pRetVal,"s",py_return.py_str);
}
if(flag==0) //返回整数
PyArg_Parse(pRetVal,"i",&py_return.py_int);
if(flag==2) //企图放回py的对象,没试过
py_return.py_object=pRetVal;
Py_Finalize();
return 0;
}