c++呼叫python解析list返回值
按照常例:直接上程式碼
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# +_)_+([email protected]#()!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解析list返回值
按照常例:直接上程式碼 moduleInterface.cpp #include "common.h" #include "moduleInterface.h" #ifndef _USRDLL int main() { wstring moduleName = L
C++呼叫 python 函式及返回值的處理【元組,字串...】
http://www.cnblogs.com/DxSoft/archive/2011/04/01/2002676.html Python 指令碼 py_test.py : #coding:utf-8 def get_int( ): a = 10 b =
C#老生常談之非同步呼叫的引數及返回值
首先,看程式碼 程式碼段1: public delegate string FuncHandle(int data1, int data2); FuncHandle fh ; private v
C#呼叫C++的Dll(引數和返回值為char* TCHAR*)
想要在C#和C++之間進行字串傳遞會涉及到兩件事情: 1.C#的string和C++的字串首指標要怎麼對應. 2.字串分為ANSI和UNICODE. C++ 標頭檔案介面: //FilePolice.h //引數和返回值為Ansi extern "C" __dec
C++呼叫python PyImport_ImportModule keras 時返回NULL
在命令列下正常import,當import keras或tensorflow時返回NULL 使用conda list 發現環境中有多個tensorflow 初步懷疑是 pip 和conda 交叉
c#獲取url請求的返回值
web c# new mar string htm http class dto /// <summary> /// 獲取url的返回值 /// </summary> /// <param name="url">eg:htt
C語言中打印返回值
返回值 struct demo bsp %d return username har strdup demo: ----return :返回值------------------ int mosquitto_username
python中input返回值的類型問題
報錯 功能 == text 2.7 () 你在 參考 類型 3.0以後的版本跟2.7的版本在語法上有一些差別的。3.0中的input(),其實對應的是2.7中的raw_input(),功能是讀取用戶輸入的字符串,也就是說你在3.0中用imput獲取的x、y其實是"21"、"
C#異步執行帶有返回值和參數的方法,且獲取返回值
urn 利用 回調方法 ext col list ont mes gate 很多時候需要用到這些小知識點,做做筆記一起成長 下面是需要異步執行的方法 //獲取所有的郵件 private List<EmailModel> GetEmailOnl
python 函數返回值(總結)
一個 ret 合成 pan 圖片 總結 size 技術 src 關鍵字:return 沒有返回值的叫過程 def test1(): msg="我是一個過程" print(msg) 有return的叫函數 def test02():
Python函數返回值、作用域
lock 環境 list() ron 結束 元組 block 變量 使用 函數的返回值:舉例1:def showplus(x):print(x)return x + 1 showplus(5)輸出結果為:56 舉例2:def showplus(x):print(x)retu
C++呼叫Python 3.7.0
開發環境:Visual Studio 2015 + Python 3.7.0 一、在C++程式碼中寫Python指令碼 在C++中含有呼叫Python指令碼的API函式,在C++程式碼中嵌入Python指令碼程式碼,是通過PyRun_SimpleString()函式實現。它允許將Pyth
C語言scanf函數返回值小記
失敗 code class 發現 用戶輸入 什麽 stdio.h 接受 例子 scanf scanf是C標準庫stdio裏面定義的用於獲取用戶輸入的函數,具體的介紹可以在CppReference上看到。scanf的返回值是已經成功賦值的變量個數,也就是說在 scanf(&q
C#呼叫ORACLE儲存過程返回結果集
Oracle中scott使用者下建立儲存過程: (注:從9i開始有了sys_refcursor這種型別,在以前的Oracle版本中需要使用REF CURSOR,並且還需放在一個程式包中) create or replace procedure sp_getdept (result
淺析 C++ 呼叫 Python 模組
淺析 C++ 呼叫 Python 模組 作為一種膠水語言,Python 能夠很容易地呼叫 C 、 C++ 等語言,也能夠通過其他語言呼叫 Python 的模組。 Python 提供了 C++ 庫,使得開發者能很方便地從 C++ 程式中呼叫 Python 模組。 具體的文件參考
C++ 呼叫Python(Pyc檔案)
原文地址:https://blog.csdn.net/horizons_kong/article/details/79030183 注:本文預設已經正確安裝Python3.4 1.編輯PythonLib.py檔案,內容如下(主要定義了兩個函式): 2.執行cmd視窗,定位到Pyth
c++ 呼叫Python指令碼或者動態庫——環境Ubuntu 16.04下用codeblocks
背景:因為使用的是python版本的程式,最終要整合到C++環境的架構中,也就是說架構是c++的,交付使用者為c++的介面,但是呼叫的是python的庫,因此需要學習在c++環境下呼叫python。因為對python不熟悉,可以說有點一抹黑,因此從簡到難逐步探索。首先在c++
C語言實現函式的返回值value的二進位制位模式從左到右翻轉後的值
// 函式的返回值value的二進位制位模式從左到右翻轉後的值 例如:在32位機器上25這個值包含下列各位: 00000000000000000000000000011001 翻轉後:(2550136832)
C++11中insert的返回值
在C++11中,關聯容器都有insert()操作,其返回值是一個pair,pair的first返回指向元素的迭代器,second是一個bool,true表示原容器中沒有要插入的元素並且插入成功,false與前者相反。 map<int,int> m;
VS C++呼叫python進行畫圖matplotlib
專案配置 需要做一些配置,很常見的。 專案名: Test 文章目錄 專案配置 注意!!!! include修改 lib修改 libs目錄新增 新增libs