c++调用python解析list返回值
2013-10-30 10:12
627 查看
按照常例:直接上代码
moduleInterface.cpp
#include "common.h" #include "moduleInterface.h" #ifndef _USRDLL int main() { wstring moduleName = L"checkPID"; wstring methodName = L"checkPid"; wstring prameter = L"fdafdasfda 610121820313221 ghhhhhhhdss# +_)_+(32131gfddsfgs@#()!123 a510101800110202adfa 610121198203132212fdaf 610121198203132210dfsafda 123213610121198203132212123214"; mapString dict; pair<mapString::iterator, bool> insert_pair; dict.insert(pair<wstring, wstring>(L"content",L"you known")); insert_pair = dict.insert(mapString::value_type(L"context", L"Mizrahi")); //int ret = CallModuleMethod(moduleName, methodName, prameter, dict); if(insert_pair.second == true) { cout<<"insert success!\n"; list<string> ret = CallModuleMethod(moduleName, methodName, prameter, dict); if(ret.empty()) { cout<<"call CallModuleMethod failed!\n"; return -1; } else { cout<<"call CallModuleMethod success!\n"; return 0; } } else { cout<<"insert failed!\n"; return -1; } } #endif /*! \author: zxh \date 2013/10/10 \version ver1.0 \param moduleName -the param is a full path of module \param methodName -function of module \param prameter - param of function \param dict - the param is a value of already exists \exception \test \note \attention \sa \remark 1.2013/10/10 15 : 05 created by zxh version \return */ SP_MODULE_DLLEXPORT list<string> CallModuleMethod(wstring moduleName, wstring methodName, wstring prameter, mapString &dict) { list<string> result; if((methodName.empty()) || (moduleName.empty()) || (prameter.empty())) { cout<<"function CallModuleMethod is null!\n"; return result; } Py_Initialize(); if(!Py_IsInitialized()) { cout<<"Py_initialize failed!\n"; return result; } PyObject *pModule,*pFunc; //载入module pModule = PyImport_ImportModule(XMLch2char(moduleName.c_str()).c_str()); if(!pModule) { PyErr_Print(); cout<<"can't find "<<XMLch2char(moduleName.c_str()).c_str()<<".py file\n"; Py_Finalize(); return result; } //load the function pFunc = PyObject_GetAttrString(pModule, XMLch2char(methodName.c_str()).c_str()); if(!pFunc || !PyCallable_Check(pFunc)) { PyErr_Print(); cout<<"can't find function "<<"["<<XMLch2char(methodName.c_str()).c_str()<<"]"<<endl; Py_DECREF(pModule); Py_Finalize(); return result; } PyObject *pArgs = PyTuple_New(2); PyObject *pDict = PyDict_New();//创建字典类型变量 if(!dict.empty()) { mapString::iterator iter = dict.begin(); while(iter != dict.end()) { PyDict_SetItemString(pDict,XMLch2char(iter->first.c_str()).c_str(), Py_BuildValue("s", XMLch2char(iter->second.c_str()).c_str()));//往字典类型变量中添加数据 ++iter; } } PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", XMLch2char(prameter.c_str()).c_str())); PyTuple_SetItem(pArgs, 1, pDict);//1---序号 将字典类型变量添加到参数元组中 PyObject *pVal = PyObject_CallObject(pFunc, pArgs); int size = PyList_Size(pVal); cout<<"List size: "<<size<<endl; mapString::iterator iter = dict.begin(); while(iter != dict.end()) { cout<<XMLch2char(iter->first.c_str()).c_str()<<":"<<\ XMLch2char(iter->second.c_str()).c_str()<<endl; iter++; } int ret;//标志位 //int times;//符合条件的数据总数 char* cstr;//符合条件的数据 PyObject *item; char tmp[MAX] = {0}; for(int i = 0; i< size; ++i) { PyObject *pRet = PyList_GetItem(pVal, i); if(PyList_Check(pRet)) { int len = PyList_Size(pRet); for(int j = 0; j < len; ++j) { item = PyList_GetItem(pRet,j); PyArg_Parse(item, "s", &cstr); result.push_back(string(cstr)); cout<<cstr<<endl; } continue; } PyArg_Parse(pRet, "i", &ret); sprintf(tmp,"%d\n",ret); result.push_back(string(tmp)); cout<<ret<<endl; } //PyObject *pRet = PyList_GetItem(pVal, 0); //PyArg_Parse(pRet, "i", &ret); //cout<<ret<<endl; //PyObject *pRet1 = PyList_GetItem(pVal, 1); //PyArg_Parse(pRet1, "i", ×); //cout<<times<<endl; //PyObject *pRet2 = PyList_GetItem(pVal, 2); //int len = PyList_Size(pRet2); //cout<<"len="<<len<<endl; //for(int j = 0;j < len; ++j) //{ // item = PyList_GetItem(pRet2,j); // PyArg_Parse(item, "s", &cstr); // //const char* temp = DetectBufCode(cstr,strlen(cstr)); // cout<<cstr<<endl; // //cout<<conv_anycode_utf8(cstr, "utf-8",temp)<<endl; //} Py_DECREF(pArgs); Py_DECREF(pModule); Py_Finalize(); return result; }
moduleInterface.h
#include <iostream> #include <string> #include <map> #include <list> #include <iostream> #include "common.h" #include "Python.h" using namespace std; #pragma comment (lib,"python25.lib") #define MAX 1024 #ifdef _USRDLL #define SP_MODULE_DLLEXPORT __declspec(dllexport) #else #define SP_MODULE_DLLEXPORT #endif typedef map<wstring, wstring> mapString; //struct Result //{ // mapString dict; // mapString content; // int sum; //}; list<string> SP_MODULE_DLLEXPORT CallModuleMethod(wstring moduleName, wstring methodName, wstring prameter, mapString &dict);
运行结果如下:
相关文章推荐
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号
- c调用python函数时,解析其返回值
- python调用c++ ctype list传数组 或者 返回数组
- C++调用python时 debug链接错误python_d.lib无法解析的问题
- c++ 调用 python 函数中文返回值乱码
- linux 下C++调用python返回值(python.so)
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法
- C++ 调用Python文件方法传递字典参数并接收返回值
- c++调用python返回值
- [VS2013]C++中调用Python脚本提示 error LNK2001: 无法解析的外部符号__imp_PyString_FromString等错误的解决方案
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法
- C++调用python并取返回值
- python下面通过ctypes模块调用c++库的方法
- python:在for遍历list时使用remove出现的问题以及解析
- VS2010下,C++调用python的Runtime error R6034解决方法
- python36 c++调用python
- linux下python调用C++动态库以及库函数
- c#调用c++开发的dll const char* 返回值接收问题
- python 调用c++