想在 C++ 中用 Python 进行数值计算,Python 需要访问 C++ 的变量并计算后返回数值。有什么好办法呢? 这是个混合编程的问题。 一般c/c++和python混合编程,问题分两种:
对于1,使用ctypes很容易。如果不想给c++库编写一套c接口,也可以使用swig来直接wrap到c++上。 对于2就比较麻烦。实际上你要做的是使用c++调用python的解释器,并且将c++的变量封装成PyObject之类的结构体作为参数传递给python接口。具体方法不展开了,自行google,有很多资料。 如果计算时间长,通信频度低的话,有比混合编程简单得多的方法,比如用 HTTP RPC 或者 Protocol Buffer / Thrift 之类。用 IPC 的方法还有一个额外的好处:允许日后将计算迁移到多机环境上去。 这个事情做过好多遍,摸索的过程基本这样的: 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. |
|