BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #3688同步于 2014/10/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

【求助】C++中调用python的方法,传递自定义的C++对象作为参数

xingqitian
2014/10/15镜像同步8 回复
目前查到的资料,C++中调用python方法还是比较简单的,但是传递的参数都是一些基本类型,不知道怎么样才能传递C++的自定义类型。 就是说,传递一个C++类的对象到python的方法中,同时还能返回另一个C++的自定义类型。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
xingqitian机器人#1 · 2014/10/15
自己先顶一下吧。。。 【 在 xingqitian 的大作中提到: 】 : 目前查到的资料,C++中调用python方法还是比较简单的,但是传递的参数都是一些基本类型,不知道怎么样才能传递C++的自定义类型。 : 就是说,传递一个C++类的对象到python的方法中,同时还能返回另一个C++的自定义类型。
nuanyangyang机器人#2 · 2014/10/15
说你具体应用吧。让Python去直接读C++数据类型不方便。
xingqitian机器人#3 · 2014/10/15
是这样的,有一个类A,有一个类B,我写一个脚本test.py,里面有一个方法Fun,参数是一个A的类型,在Fun里面可能利用A的一些数据构造另一个类B的实例,然后返回这个B实例。C++调用Fun得到返回的对象。 【 在 nuanyangyang 的大作中提到: 】 : 说你具体应用吧。让Python去直接读C++数据类型不方便。
nuanyangyang机器人#4 · 2014/10/15
【 在 xingqitian 的大作中提到: 】 : 是这样的,有一个类A,有一个类B,我写一个脚本test.py,里面有一个方法Fun,参数是一个A的类型,在Fun里面可能利用A的一些数据构造另一个类B的实例,然后返回这个B实例。C++调用Fun得到返回的对象。 : 要这么频繁地在Python和C++之间互相调用这么多次?具体是为了什么?
xingqitian机器人#5 · 2014/10/15
其实只是传递一个C++对象到python的方法中,然后python返回一个C++对象。具体为什么要这么做,一言难尽,为了毕业吧。 【 在 nuanyangyang 的大作中提到: 】 : : 要这么频繁地在Python和C++之间互相调用这么多次?具体是为了什么?
nuanyangyang机器人#6 · 2014/10/15
还是让你死心得彻底一点吧:想想,如果真的将一个C++的对象传给Python,Python看到的只是一串字节,即这个对象在内存中的表示。由于“C++对象在内存中如何表示”和编译器极其相关,官方Python是一个用C语言写的解释器,自然无法处理。所以,“将任意C++对象传给Python让Python处理”是做不到的。如果要做类似的事,封装一下C++对象将其变成Python对象是必须的。 真的,好好想想具体应用场景吧,究竟为什么要这样做?
nuanyangyang机器人#7 · 2014/10/15
官方推荐的方法是:对每个想要在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
xingqitian机器人#8 · 2014/10/16
好的,谢谢,我有什么新发现也会及时反馈过来。直接传递一个字符串到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 : ...................