没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
 
                
            转帖|其它|编辑:郝浩|2010-11-10 13:23:27.000|阅读 1322 次
概述:最近使用C++写服务器端的代码,通过Socket监听客户端请求,解析客户端请求中的参数,并根据解析后的结果,在服务端拼接SQL传递给数据库执行。一想到C++中字符串解析以及字符串类型转换,以及字符串的拼接...过来人都知道有多么痛苦,这不,我的Python工具-SqlBuilder也就应需求而生了,将Python嵌入到C++中,用Python代码实现字符串的解析及加工,拼接等操作交给嵌入到C++中的Python引擎去执行,嗨,这下省力多了。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
最近使用C++写服务器端的代码,通过Socket监听客户端请求,解析客户端请求中的参数,并根据解析后的结果,在服务端拼接SQL传递给数据库执行。一想到C++中字符串解析以及字符串类型转换,以及字符串的拼接...过来人都知道有多么痛苦,这不,我的Python工具-SqlBuilder也就应需求而生了,将Python嵌入到C++中,用Python代码实现字符串的解析及加工,拼接等操作交给嵌入到C++中的Python引擎去执行,嗨,这下省力多了。
进入正题,这一次的实现主要有两个目的:
一.如何将Python嵌入到C++代码中
二.用Python实现一个简单的SqlBuilder工具
先简要说明一下我的本机环境:xp + vs2008 + python26
一.如何将Python嵌入到C++
1)安装python,如果您问具体怎么安装,请您老google一下,我使用的python26的版本,默认安装在c:\python26
2)设定vs2008 引入python头文件: tools->options->projects and solutions->
vc++ directiories->add includes, add lib
   
 
3) 引入python头文件,这里注意,可能你会遇到编译时的错误,找不到python26_d.lib,或者遇到链接错误,如无法解析的外部符号 __imp___Py_RefTotal等错误,请按下列的步骤进行处理
对于错误1,请复制python26.lib,然后改名为python26_d.lib
对于错误2,请在引入python头文件前,加
#undef _DEBUG
  #include <python.h>
  4) 编写c++接口函数,函数内部实现python解析器的初始化,调用python代码,以及python解析器的卸载工作
具体代码如下:
1 #undef _DEBUG /* Link with python26.lib and not python26_d.lib */
2 #include <Python.h>
3 
4 ///<Surmary>
5 /// 引入Python引擎构建Sql工具
6 /// 参数说明:
7 ///     pTemplateName:对应Sql名称
8 ///     pValues:客户端请求的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,第一步工作完成后,已经实现了一个c++调用python代码的接口函数,现在再来实现第二部分,如何调用python代码,这里顺便实现一个sql构建工具
#-*-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}""")
这个就是python的sqlbuilder工具,代码说明:包含两个部分:
1.SQL语句模板
2.构造SQL函数
参数说明:pTemplate 对应SQL模板中的SQL语句。
pValues: 通过客户端请求参数(json格式),参考上述代码中的测试代码中给定的字符串格式
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@ldacury.cn
文章转载自:博客园



 
					接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
 
					面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
 
					本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
 
					本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@ldacury.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
 
                 
            
 靠谱朗驰娱乐体育
靠谱朗驰娱乐体育  
					 
					 
					 
					 
					