我有两个不同的Python扩展模块;我们姑且称之为A和B.模块A包含一个名为容器,我想作为一个类的方法的返回类型模块B内使用存储类类型。

我似乎无法找到我应该如何做到这一点的任何文档。我粗略地跟着这篇文章来创建模块/班,除了我没有申报所有方法为静态,这样他们就可以访问:的 http://nedbatchelder.com/text/whirlext.html

我的问题是,然后,我怎么去创造容器的一个实例,我可以传回作为模块B类方法的的PyObject *返回值?容器定义如下所示:

typedef struct {
    PyObject_HEAD

    storageclass* cnt_;
} container;

我试图简单地做有问题,其中container_init是我已经注册为tp_init用于容器类中的方法,所述方法中执行以下操作:

pycnt::container* retval;
pycnt::container_init(retval, NULL, NULL);
return (PyObject*)retval;

然而,根据Python解释我得到背面的类,我调用的方法上。 (即,myclassinstance.mymethod()被返回myclassinstance)。

我显然会对此错误的方式,但我不知道正确的方法是什么。有什么建议么?只是为了节省任何人关闭,那将表明,它 - 不,我没有使用痛饮或升压:: Python的兴趣。我想,已经和容器中的底层存储类不与任何发挥很好(痛饮甚至无法解析它)。到目前为止,做自己一直是相当痛苦的扩展,但我难倒就这一个。

有帮助吗?

解决方案

您的问题是,type->tp_init你想要什么没有做。一个对象被分配做实例化后type->tp_init被调用。你首先必须使用type->tp_new分配对象,然后传递对象作为第一个参数type->tp_init。既然你传递一个未初始化的指针tp_init,全盘皆输。你通常不直接调用两个函数,不过,改为调用类型的对象本身PyObject_Call*()之一来创建一个新的实例。或者提供一个普通的C函数来创建一个新的实例,一拉PyFoo_New()

这就是说,通常的方式在两个扩展模块之间做互通是通过Python API来做到这一点。如果你想模块B,以进口和使用模块A,你叫PyImport_Import()获取模块对象,PyObject_GetAttrString()让你关心的对象类型,以及PyObject_Call*()的一个实例化。要存储指向该类型的任何地方,你只需要一个PyObject *

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top