分享

如何实现 c/c 与 python 的通信?

 youxd 2017-01-04

想在 C++ 中用 Python 进行数值计算,Python 需要访问 C++ 的变量并计算后返回数值。有什么好办法呢?

这是个混合编程的问题。

一般c/c++和python混合编程,问题分两种:

  1. python调用c/c++

  2. c/c++调用python

对于1,使用ctypes很容易。如果不想给c++库编写一套c接口,也可以使用swig来直接wrap到c++上。

对于2就比较麻烦。实际上你要做的是使用c++调用python的解释器,并且将c++的变量封装成PyObject之类的结构体作为参数传递给python接口。具体方法不展开了,自行google,有很多资料。

如果计算时间长,通信频度低的话,有比混合编程简单得多的方法,比如用 HTTP RPC 或者 Protocol Buffer / Thrift 之类。用 IPC 的方法还有一个额外的好处:允许日后将计算迁移到多机环境上去。

如何实现 c/c++ 与 python 的通信?

这个事情做过好多遍,摸索的过程基本这样的:

1. 通过stdout通信...土到爆,但上手极快,简单粗暴;

2. 调用原始的python.h 接口,编写可以被python import 的so,支持python调用c++接口,c++接口调用python同样的方式;

3. 使用boost-python 完成2中的功能,接口简单很多,本质上没有不同;

这里遇到的主要几个问题在于:

1. 数据的序列化反序列化,因为有时c++和python之间通信的不是基本类型,可能是用户自定义类型;

2. 多线程的问题,c++多线程调python接口时,需要注意GIL的使用,貌似因为python解释器不是线程安全的;

3. 对象传递,大多数情况下,如果只是静态接口调用,都比较简单,考虑一种情况:c++中的对象的一个函数调用python一个接口,这个python接口中又需要反过来调用这个对象中的另一个接口,这里就需要考虑怎么把对象相互传递,我这里是把对象指针地址传递到python中,在python中调用一个c++的静态接口,带上地址和其他需要的参数,在这个c++的静态接口中,把地址转换成指针在调用..

我写个比较蠢的:

设置一个ini文档,大致格式如下

[cal]

calFlag=1

param=xxx

result=yyy

C++将需要计算的参数写给param,然后将calFlag改为1,表示“请求计算”

Python程序循环读取calFlag,当值为1时,再读param的值,计算完后,将结果写在result里,将calFlag改为0,表示“计算完毕”

C++同样循环读calFlag,读到是0时,知道结果已经出来,于是读result。

下载更多资料可以点击:http://a.eqxiu.com/s/klhbni3Z 官方微信:baweixuexiao

QQ交流群:225759209 qq:532634714

咨询网址:http://www.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多