实战构建Python和C++混合系统
关于C++和Python之间互相调用的问题,可以查找到很多资料。本文将主要从解决实际问题的角度看如何构建一个Python和C++混合系统。
力为 2009
一、概念
混合系统:采用多种语言构建的系统。比如Native C++和dotNet的混合系统,Python/Lua和C++的混合系统。
Python和C++各有各的优缺点,构建两者混合系统的主要目的就是利用Python的灵活性和C++高效性,增加程序的扩展性。当然还有其他好处,此处就不展开谈了。脚本语言有很多,至于为什么不采用其他的(如Lua、Ruby等),这里也不考虑。脚本语言的采用主要是个人喜好的问题。采用Lua可以查到很多资料,以前也曾用LuaBind实现过。
二、系统架构
混合系统可以简化成如下模型:
系统的运行过程为:
首先在应用程序中嵌入脚本语言解析器,然后用脚本语言提供的C/C++ API封装已有的C++功能库,再用脚本调用封装的服务。此后,应用层便可以执行脚本里的内容,其效果与应用层直接调用服务层类似。
三、实现
本例中采用脚本语言Python,因此主要工作为在应用层嵌入Python解析器,用Python封装服务层。为了说明问题,应用层的实现为PythonConsole.ex,服务层的实现为Mythma.dll,封装层为MythmaPy.dll。
1、假定Mythma.dll中的一个类为CHelloWorld:
class MythmaAPI CHelloWorld
{
public:
CHelloWorld(void);
~CHelloWorld(void);
void SetId(int nId) { m_Id = nId;}
int GetId() const { return m_Id; }
private:
int m_Id;
};
2、现在用Boost.Python封装该类:
#include "HelloWorld.h"
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(My
相关文档:
http://hi.baidu.com/guzhilei1986/blog/item/8969b4debe99e150ccbf1ae7.html
函数 描述
int(x [,base ]) ......
python的自动补全有很多方法,本质上都是用字典。生成字典最常用的当然是ctag了,但是每次增加模块都要ctag一次也挺麻烦的。
能偷懒的是后偷懒是一种美德,有人已经做了字典和增加模块的脚本,我们干嘛不坐享其成呢。
http://vim.sourceforge.net/scripts/script.php?script_id=850
这个名为pydiction的项目包括了一个字 ......
上次学习过marshal模块用于序列化和反序列化,但marshal的功能比较薄弱,只支持部分内置数据类型的序列化/反序列化,对于用户自定义的类型就无能为力,同时marshal不支持自引用(递归引用)的对象的序列化。所以直接使用marshal来序列化/反序列化可能不是很方便。还好,python标准库提供了功能更加强大且更加安全的pickle ......
在网上搜不到关于 Ascii 和 bcd互相转化的文章,于是自己写了一个,和大家分享下。
没有考虑到效率,能够优化的地方望大家提出
"""
AscII字符转换为BCD字符
"""
def asc2bcd(inAsc, pad_L0_R1 = 0):
#全部转换为大写,为后面的转换提供方便
inAsc = inAsc.upper()
&nb ......
从MoteLab返回的串口数据,包含messages.pickle文件这是MoteLab系统中串口收集数据的总和,但是这些数据需要解析后才能进行分析。下面的代码就是在python环境下提取message有效数据的代码。
使用命令 python TestOutput.py messages.pickle
生成的test.log就是获得的有效数据
返回数据的示例
1252985727.66 recei ......