Python中文
首页
教程
问答
标签
搜索
登录
注册
什么是最干净的方法调用一个Python函数从C++与一个Sigg包裹的Obj.
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<P>我有下面的代码,它实现了一个简单的C++类(ObjutpyPrCuBube),带有Python回调函数。其思想是用“this”作为单个参数来调用Python函数。</p> <p>问题是,由于ObjWithPyCallback是一个SWIG包装的对象,我需要SWIG typeinfo来创建一个Python对象。</p> <p>问题是它在SWIG生成的文件“ObjWithPyCallback_wrap.cxx”中。SWIG可以生成头文件吗?到目前为止,我还没能做到这一点。</p> <p>但是,即使有头文件,SWIG和我的主实现之间也存在循环依赖关系,这很烦人。如果可能的话,我想找个办法避免它。最终,ObjWithPyCallback会出现在与Python绑定不同的共享库中。</p> <p>有没有一个干净的方法来完成这个?我知道<a href="https://stackoverflow.com/questions/1575802/python-callback-with-swig-wrapped-type">this post</a>,但它只涉及SWIG廑NewPointerObj的机制。</p> <p>提前感谢您的帮助!</p> <p>代码如下:</p> <p>文件:example.py</p> <pre><code>import cb def foo(x=None): print("Hello from Foo!") # I'd like x to be a reference to a ObjWithPyCallback object. print(x) o = cb.ObjWithPyCallback() o.setCallback(foo) o.call() </code></pre> <p>文件:ObjWithPyCallback.h</p> <pre><code>#include <Python.h> class ObjWithPyCallback { public: ObjWithPyCallback(); void setCallback(PyObject *callback); void call(); PyObject *callback_; }; </code></pre> <p>文件:ObjWithCallback.cpp</p> <pre><code>#include "ObjWithPyCallback.h" #include <iostream> ObjWithPyCallback::ObjWithPyCallback() : callback_(NULL) {} void ObjWithPyCallback::setCallback(PyObject* callback) { if (!PyCallable_Check(callback)) { std::cerr << "Object is not callable.\n"; } else { if ( callback_ ) Py_XDECREF(callback_); callback_ = callback; Py_XINCREF(callback_); } } void ObjWithPyCallback::call() { if ( ! callback_ ) { std::cerr << "No callback is set.\n"; } else { // I want to call "callback_(*this)", how to do this cleanly? PyObject *result = PyObject_CallFunction(callback_, ""); if (result == NULL) std::cerr << "Callback call failed.\n"; else Py_DECREF(result); } } </code></pre> <p>文件::ObjWithPyCallback.i</p> <pre><code>%module cb %{ #include "ObjWithPyCallback.h" %} %include "ObjWithPyCallback.h" </code></pre>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>我将使用SWIG处理继承的机制,并拥有一个带有虚拟函数<code>void call()</code>的回调类。然后使用SWIG使该类在Python中能够派生。</p> 在Python中,您只需确定设置回调的位置,就将其包在由C++回调类派生的Python类的实例中,并使其^ {< CD2>}成员函数执行回调。这也是你做测试的地方,看看它是否可以调用。然后用这个包装器对象调用<code>setCallback</code>函数。</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
(编辑)背景2+均值漂移跟踪?
8 回答
(网络爬虫)如何从新闻网站获取新闻段落的文本
1 回答
(置换)列表的唯一组合
10 回答
(美丽的soap4,)AttributeError:“非类型”对象没有属性“获取文本”
4 回答
(聊天室)使用套接字通常只允许一个地址(协议/网络地址/端口)
9 回答
(自动)在Pycharm/Python中的=后缩进
6 回答
(自动Py到Exe和Python)找不到“googleapipythonclient”发行版,该发行版是应用程序所必需的
8 回答
(自动操作)write()和do for循环的Odoo问题
2 回答
(自定义)百分位MSE损失函数
3 回答
(自定义用户)createsuperuser TypeError:hasattr():属性名必须是字符串
8 回答
(节点)警告:检测到可能的EventEmitter内存泄漏。添加了11个消息侦听器。使用emitter.setMaxListeners()增加limi
10 回答
(若变量中有字符串)语句未筛选出数据
8 回答
(英语、Perl、Python、Ruby)在代码片段的基础上进行比较?
8 回答
(范围(1,36),7)和+条件下的所有组合
8 回答
(范围(3),范围(3))值错误:要解压缩的值太多(预期为2)
1 回答
(蟒蛇) 平均分配数字
5 回答
(行、列):数据帧的值
6 回答
(行、列)形式的最小值
9 回答
(解决)导入PYBID11/C++编译模块不工作
10 回答
(记忆有效)将“排序”作为生成器实现
4 回答