返回信息流目前查到的资料,C++中调用python方法还是比较简单的,但是传递的参数都是一些基本类型,不知道怎么样才能传递C++的自定义类型。
就是说,传递一个C++类的对象到python的方法中,同时还能返回另一个C++的自定义类型。
这是一条镜像帖。来源:北邮人论坛 / python / #3688同步于 2014/10/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
【求助】C++中调用python的方法,传递自定义的C++对象作为参数
xingqitian
2014/10/15镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
自己先顶一下吧。。。
【 在 xingqitian 的大作中提到: 】
: 目前查到的资料,C++中调用python方法还是比较简单的,但是传递的参数都是一些基本类型,不知道怎么样才能传递C++的自定义类型。
: 就是说,传递一个C++类的对象到python的方法中,同时还能返回另一个C++的自定义类型。
是这样的,有一个类A,有一个类B,我写一个脚本test.py,里面有一个方法Fun,参数是一个A的类型,在Fun里面可能利用A的一些数据构造另一个类B的实例,然后返回这个B实例。C++调用Fun得到返回的对象。
【 在 nuanyangyang 的大作中提到: 】
: 说你具体应用吧。让Python去直接读C++数据类型不方便。
【 在 xingqitian 的大作中提到: 】
: 是这样的,有一个类A,有一个类B,我写一个脚本test.py,里面有一个方法Fun,参数是一个A的类型,在Fun里面可能利用A的一些数据构造另一个类B的实例,然后返回这个B实例。C++调用Fun得到返回的对象。
:
要这么频繁地在Python和C++之间互相调用这么多次?具体是为了什么?
其实只是传递一个C++对象到python的方法中,然后python返回一个C++对象。具体为什么要这么做,一言难尽,为了毕业吧。
【 在 nuanyangyang 的大作中提到: 】
:
: 要这么频繁地在Python和C++之间互相调用这么多次?具体是为了什么?
还是让你死心得彻底一点吧:想想,如果真的将一个C++的对象传给Python,Python看到的只是一串字节,即这个对象在内存中的表示。由于“C++对象在内存中如何表示”和编译器极其相关,官方Python是一个用C语言写的解释器,自然无法处理。所以,“将任意C++对象传给Python让Python处理”是做不到的。如果要做类似的事,封装一下C++对象将其变成Python对象是必须的。
真的,好好想想具体应用场景吧,究竟为什么要这样做?
官方推荐的方法是:对每个想要在python中使用的C++类,创造一个Python类型来封装这个C++类型。比如你说的A类,你创造一个AWrapper类,这是Python类,不是C++类。这样Python里使用的总是这个AWrapper而不是A。同理,为B制造一个叫BWrapper的Python类。不知道你的C++数据多复杂,但这样做工作量不小,没有魔术般的方法帮你做。(swig倒是可以试试,也要写接口文件,也要学习)
这一章教你如何嵌入Python解释器,专门有如何从C调Python的方法。 https://docs.python.org/3/extending/embedding.html
这一章教你如何用C创建自定义Python类型: https://docs.python.org/3/extending/newtypes.html
好的,谢谢,我有什么新发现也会及时反馈过来。直接传递一个字符串到python肯定是不行的,因为python根本不知道类的定义。所以,我本意是想有没有办法可以将C++的类和方法注册到python中去。目前发现boost有个python模块似乎是可以将C++的类和方法注册到python中去的。正在学习。
还是特别感谢你,谢谢!
【 在 nuanyangyang 的大作中提到: 】
: 官方推荐的方法是:对每个想要在python中使用的C++类,创造一个Python类型来封装这个C++类型。比如你说的A类,你创造一个AWrapper类,这是Python类,不是C++类。这样Python里使用的总是这个AWrapper而不是A。同理,为B制造一个叫BWrapper的Python类。不知道你的C++数据多复杂,但这样做工作量不小,没有魔术般的方法帮你做。(swig倒是可以试试,也要写接口文件,也要学习)
: 这一章教你如何嵌入Python解释器,专门有如何从C调Python的方法。 https://docs.python.org/3/extending/embedding.html
: 这一章教你如何用C创建自定义Python类型: https://docs.python.org/3/extending/newtypes.html
: ...................