1. 程式人生 > >c++呼叫python解析list返回值

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