如何在C++和Python间优雅的共享数据

前几天工作中遇到一个需求,C++和Python混合编程,这个刚开始没有多想,内心觉得这应该很简单,无非就是把C++代码暴露出C接口,并且编译成动态链接库的形式供Python加载起来就好了。

有的同学可能会想为什么需要用Python去调用C++代码呢?我们都知道,Python代码是解释执行的,用起来非常方便,但是解释执行的代码都有一个缺点,那就是运行起来非常慢;而C++是编译型语言,性能不是问题,但缺点是代码写起来很啰嗦,因此C++和Python混合编程就是起到一个互补的作用,对于性能要求较高的核心逻辑用C++实现,其余部分用Python快速实现,这就是C++和Python混合编程的一个应用场景。

但这并不是本文的重点。

 

问题

重点是这样的,当Python调用C++的函数时该怎么给C++函数传递参数呢?当Python需要C++的返回结果是该怎么办呢?

要知道Python不认识C++对象,C++也不认识Python对象,这就好比一个说中文和一个说法语的,这两个人该怎么交流呢?显然这需要一个翻译,但是翻译是唯一的答案吗,对应到我们的问题,难道我们要把C++对象转为Python对象或者把Python对象转为C++对象吗?这个我去查了一下确实是可以的,只不过对象内容比较简单的是可以相互转换的,但是对于复杂的class就不容易做到了,除了请一位翻译就没有其它办法了吗?

 

通用语言

实际上还有一种方法不用请翻译,那就是如果这两个人都会说英文就可以了,在这里作为通用语言的英文就类似于“协议”,实际上如果一个Python程序和C++程序位于不同的主机上也是可以通信的,无非就是借助网络通信,而网络通信基于的也就是“协议”,网络协议作为计算机通信界中的英语是任何语言编写的程序都认识的。

但在这里Python和C++是混合编程的,不需要经过复杂的网络,因此我们需要为Python和C++程序找到它们都会说的英语,这门英语就是字符串

 

字符串,自解释

实际上除了Python、C++之外任何一门语言都能处理字符串,而字符串有一个天然的优势,那就是自解释,self description,对于字符串"computer",只要提供该字符串所在的内存地址,任何一门语言写的代码都能正确处理该字符串,因此字符串就可以起到英语的作用。

现在我们已经找到解决问题的方向了,那就是字符串,但是字符串太灵活了,类似表达“小明重100斤”这样的信息,可以使用“小明的重量是100斤”,“小明100斤”,“小明的体重是100斤”等等,很显然我们需要定义字符串的格式,以一种标准化的形式来描述信息,可以是这样的{“xiaoming” : 100},这就是一种格式化的字符串,因此我们需要像这样自己定义一套描述信息的方式,幸好这项工作已经有人实现了,这就是Json(实际上XML也是可以的,只不过XML过于复杂)。

 

Json

Json本质上就是字符串,但是有自己定义的格式,任何一门语言拿到Json定义的字符串后都能正确的解析出内容来,换句话说Json实际上是一种语言独立的(language-independent,这里的语言指编程语言)数据类型,不但利于人类阅读也利于机器解析。

Json语法非常的简单,但是使用Json你可以使用字符串来表示非常复杂的数据,一定要记住,Json是纯文本的。

Json最常见的使用场景是Web应用,用来从server端向浏览器发送数据的。

 

总结

在这里我们可以看到纯文本的力量,那就是通用性,二进制就不具备通用性,除非事先声明每一个字节是什么意义,也就是说二进制不具备自解释的特性。因此在进行系统设计时不要忘了简单但强大的文本。

更多计算机内功文章,欢迎关注微信公共账号:码农的荒岛求生

在这里插入图片描述
彻底理解操作系统系列文章
1,什么程序?
2,进程?程序?傻傻分不清
3,程序员应如何理解内存:上篇
4,程序员应如何理解内存:下篇
 
 

计算机内功决定程序员职业生涯高度

你可能感兴趣的:(计算机内功)