轉(zhuǎn)帖|其它|編輯:郝浩|2010-11-10 13:23:27.000|閱讀 1322 次
概述:最近使用C++寫(xiě)服務(wù)器端的代碼,通過(guò)Socket監(jiān)聽(tīng)客戶端請(qǐng)求,解析客戶端請(qǐng)求中的參數(shù),并根據(jù)解析后的結(jié)果,在服務(wù)端拼接SQL傳遞給數(shù)據(jù)庫(kù)執(zhí)行。一想到C++中字符串解析以及字符串類型轉(zhuǎn)換,以及字符串的拼接...過(guò)來(lái)人都知道有多么痛苦,這不,我的Python工具-SqlBuilder也就應(yīng)需求而生了,將Python嵌入到C++中,用Python代碼實(shí)現(xiàn)字符串的解析及加工,拼接等操作交給嵌入到C++中的Python引擎去執(zhí)行,嗨,這下省力多了。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
最近使用C++寫(xiě)服務(wù)器端的代碼,通過(guò)Socket監(jiān)聽(tīng)客戶端請(qǐng)求,解析客戶端請(qǐng)求中的參數(shù),并根據(jù)解析后的結(jié)果,在服務(wù)端拼接SQL傳遞給數(shù)據(jù)庫(kù)執(zhí)行。一想到C++中字符串解析以及字符串類型轉(zhuǎn)換,以及字符串的拼接...過(guò)來(lái)人都知道有多么痛苦,這不,我的Python工具-SqlBuilder也就應(yīng)需求而生了,將Python嵌入到C++中,用Python代碼實(shí)現(xiàn)字符串的解析及加工,拼接等操作交給嵌入到C++中的Python引擎去執(zhí)行,嗨,這下省力多了。
進(jìn)入正題,這一次的實(shí)現(xiàn)主要有兩個(gè)目的:
一.如何將Python嵌入到C++代碼中
二.用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的SqlBuilder工具
先簡(jiǎn)要說(shuō)明一下我的本機(jī)環(huán)境:xp + vs2008 + python26
一.如何將Python嵌入到C++
1)安裝python,如果您問(wèn)具體怎么安裝,請(qǐng)您老google一下,我使用的python26的版本,默認(rèn)安裝在c:\python26
2)設(shè)定vs2008 引入python頭文件: tools->options->projects and solutions->
vc++ directiories->add includes, add lib
3) 引入python頭文件,這里注意,可能你會(huì)遇到編譯時(shí)的錯(cuò)誤,找不到python26_d.lib,或者遇到鏈接錯(cuò)誤,如無(wú)法解析的外部符號(hào) __imp___Py_RefTotal等錯(cuò)誤,請(qǐng)按下列的步驟進(jìn)行處理
對(duì)于錯(cuò)誤1,請(qǐng)復(fù)制python26.lib,然后改名為python26_d.lib
對(duì)于錯(cuò)誤2,請(qǐng)?jiān)谝?python頭文件前,加
#undef _DEBUG
#include <python.h>
4) 編寫(xiě)c++接口函數(shù),函數(shù)內(nèi)部實(shí)現(xiàn)python解析器的初始化,調(diào)用python代碼,以及python解析器的卸載工作
具體代碼如下:
1 #undef _DEBUG /* Link with python26.lib and not python26_d.lib */
2 #include <Python.h>
3
4 ///<Surmary>
5 /// 引入Python引擎構(gòu)建Sql工具
6 /// 參數(shù)說(shuō)明:
7 /// pTemplateName:對(duì)應(yīng)Sql名稱
8 /// pValues:客戶端請(qǐng)求的Json字符串
9 ///</Surmary>
10 void SqlBuilder(const char* pTemplateName,const char* pValues, char* &sql)
11 {
12 PyObject *pArgs, *pName, *pModule, *pDict, *pFunc;
13 PyObject *pValue;
14
15 // 初始化python解析器引擎
16 Py_Initialize();
17
18 pName = PyString_FromString("SqlBuilder");
19 /* Error checking of pName left out */
20
21 pModule = PyImport_Import(pName);
22 Py_DECREF(pName);
23
24 if (pModule != NULL) {
25 pFunc = PyObject_GetAttrString(pModule, "BuildSql");
26 /* pFunc is a new reference */
27
28 if (pFunc && PyCallable_Check(pFunc)) {
29 pArgs = PyTuple_New(2);
30 pValue = PyString_FromString(pTemplateName);
31 if (!pValue) {
32 Py_DECREF(pArgs);
33 Py_DECREF(pModule);
34 fprintf(stderr, "Cannot convert argument pTempateName \n");
35 return;
36 }
37 /* pValue reference stolen here: */
38 PyTuple_SetItem(pArgs,0, pValue);
39
40 pValue = PyString_FromString(pValues);
41 if (!pValue) {
42 Py_DECREF(pArgs);
43 Py_DECREF(pModule);
44 fprintf(stderr, "Cannot convert argument pValue\n");
45 return;
46 }
47 PyTuple_SetItem(pArgs,1, pValue);
48 pValue = PyObject_CallObject(pFunc, pArgs);
49 Py_DECREF(pArgs);
50 if (pValue != NULL) {
51 sql = PyString_AsString(pValue);
52 printf("Result of call: %s\n", sql);
53 Py_DECREF(pValue);
54 }
55 else {
56 Py_DECREF(pFunc);
57 Py_DECREF(pModule);
58 PyErr_Print();
59 fprintf(stderr,"Call failed\n");
60 return;
61 }
62 }
63 else {
64 if (PyErr_Occurred())
65 PyErr_Print();
66 fprintf(stderr, "Cannot find function\"%s\"\n", "BuildSql");
67 }
68 Py_XDECREF(pFunc);
69 Py_DECREF(pModule);
70 }
71 else {
72 PyErr_Print();
73 fprintf(stderr, "Failed to load \"%s\" model\n", "SqlBuilder");
74 return;
75 }
76
77 // 卸載Python解析器引擎
78 Py_Finalize();
79
80 return;
81 }
ok,第一步工作完成后,已經(jīng)實(shí)現(xiàn)了一個(gè)c++調(diào)用python代碼的接口函數(shù),現(xiàn)在再來(lái)實(shí)現(xiàn)第二部分,如何調(diào)用python代碼,這里順便實(shí)現(xiàn)一個(gè)sql構(gòu)建工具
#-*-coding:utf-8-*-
#SqlBuilder.py
from string import Template
dicSqlTemplate= {
"A_UpdateT_Table":"""update t_table set tablename =
'${tablename}' where tableid= '${tableid}' """
}
def BuildSql(template,values):
return Template(dicSqlTemplate[template]).safe_substitute(
if __name__ == "__main__":
print BuildSql("A_UpdateT_Table", """{"tablename":'t_table', 'tableid':12}""")
這個(gè)就是python的sqlbuilder工具,代碼說(shuō)明:包含兩個(gè)部分:
1.SQL語(yǔ)句模板
2.構(gòu)造SQL函數(shù)
參數(shù)說(shuō)明:pTemplate 對(duì)應(yīng)SQL模板中的SQL語(yǔ)句。
pValues: 通過(guò)客戶端請(qǐng)求參數(shù)(json格式),參考上述代碼中的測(cè)試代碼中給定的字符串格式
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園