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