享受SWIG带来的快乐时光

我在这里与Swig,Python,Embedded Python和
C ++类导出到Python.这是情节:
我在C ++ DLL库中定义了一个类.我正在包装这堂课(我们将
将其称为"彼得")带有swig,因此它的某些基本功能可在
Python.为了这个示例,彼得有一种称为get_type()的方法,
这没有任何争论并返回整数.这一切都起作用,在我的内部
Python环境我可以创建彼得的实例,复制它们,查询他们的
价值 - 我需要与他们一起做的一切.我已经从
Python解释器具有预期的结果.彼得在功能上存在
Python的环境.
但是,我也将Python嵌入到一个应用程序中,该应用程序
需要执行大量使用Peter的Python模块(A-Ha!
情节变厚!).彼得在Python环境中的实例包含
我需要从Python环境中设置的单数数据
在嵌入式Python代码中.我还在我的
C ++代码.
这是我正在寻找的示例:
#这是SWIG生成的Python导入模块
从彼得进口 *
班级基础:
def __init __(自我):
self.peters = []
班级子类(基本):
def __init __(自我):
基督教.__init __(自我)
my_peter =彼得(0)
self.peters.append(my_peter)
然后,在我的嵌入式代码中,在创建了Python子类的实例之后:
...
pyObject* key = pysstring_fromstring(" peters");
pyObject* py_peters = pyobject_getattr(py_subclass_inst,key);
py_xdecref(key);
如果(!py_peters ||!pylist_check(py_peters))
//处理此错误
for(int j = 0; j {
pyObject* py_peter = pylist_getItem(py_peters,j);
pyObject* py_peter_method = pyObject_getAttrstring(py_peter," get_type");
如果(!py_peter_method ||!pycallable_check(py_peter_method))
继续;
pythreadstate* old_thread_state = pythreadstate_swap(my_interpreter);
pyObject* pargs = py_buildvalue("()");
pyObject* py_peter_type = pyeval_callobject(py_peter_method,pargs);
...
因此,就在pyeval_callobject()中,我们正在调用swig生成的代码
执行Peter的get_type()C ++方法.但是,这个电话返回-1
(不是编码为peter的get_type()方法的值.我调试到了Swig
代码,我看到我遇到了PYEXC_TYPEERROR错误,并带有消息
看起来像:
在方法的" peter_get_type"中,类型为" peter const *"的参数1
检查手表窗口,pyObject-> obj_type-> tp_name" py_peter"是
"彼得"(不是"实例",正如我所见过的那样,它与其他python一起设置为
属性).这使我相信我要处理的不是
实际上是彼得的实例,而是彼得的类模板.这个
使我感到困惑,因为我以为我用实例将彼得斯[]阵列初始化.
有人对此有任何有用的见解吗?为什么Swig Barfing?我也许是
错误地访问Peter实例?
许多 提前致谢.

# 回答1

没有人对此有任何帮助吗? 让我看看是否可以使用更简单的东西来清楚地表明它: +-------+ ------- | 彼得| --------- | + -------+ | | | v v +-----------------++----------------------+ | python | | 应用程序| | 环境| | 环境| +-----------------++----------------------+ ^ ^ | | --- < - < - - > - > ---- 两种环境都在其环境中使用C ++类Peter(应用程序 直接,通过swig python). 我如何在之间交换彼得的实例 他们? 我如何获得彼得的python-envonment实例 python特定的设置介入应用程序的环境(反之亦然)? 或者... 任何人都知道特定于Swig的邮件列表或论坛讨论 这种类型的问题会更合适吗?

标签: python

添加新评论