如何在Python C API中使用多个模块/类型?

2024-05-19 21:14:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同的Python扩展模块;我们称它们为A和B。模块A包含一个名为container的存储类类型,我想在模块B中使用它作为类方法的返回类型。在

我好像找不到我该怎么做的任何文件。我大致按照本文创建模块/类,但我没有将所有方法声明为静态的,因此它们是可访问的:http://nedbatchelder.com/text/whirlext.html

我的问题是,如何创建一个容器实例,并将其作为模块B中类方法的PyObject*返回值传回?容器定义如下所示:

typedef struct {
    PyObject_HEAD

    storageclass* cnt_;
} container;

我尝试在所讨论的方法中简单地执行以下操作,其中container_init是我为容器类注册为tp_init的方法:

^{pr2}$

不过,根据Python解释器,我要返回调用该方法的类。(即。,myclassinstance.mymethod()正在返回myclassinstance)。在

我显然走错了路,但我不知道什么才是正确的。有什么建议吗?只是为了切断任何人的建议-不,我对使用SWIG或Boost::Python不感兴趣。我已经尝试过了,但是容器的底层存储类都不能很好地使用(SWIG甚至不能解析它)。到目前为止,我自己做扩展是相当痛苦的,但我在这个问题上被难住了。在


Tags: 模块文件方法http声明类型initcontainer
1条回答
网友
1楼 · 发布于 2024-05-19 21:14:05

你的问题是type->tp_init没有做你想要的。type->tp_init在分配对象执行实例化后调用。首先必须使用type->tp_new分配对象,然后将该对象作为第一个参数传递给type->tp_init。由于您传递了一个指向tp_init的未初始化指针,因此所有赌注都已取消。但是,通常不直接调用这两个函数,而是调用类型对象本身的PyObject_Call*()之一来创建新实例。或者提供一个普通的C函数来创建一个新实例laPyFoo_New()。在

也就是说,在两个扩展模块之间进行交互的通常方法是通过pythonapi来实现。如果希望模块B导入并使用模块A,可以调用PyImport_Import()来获取模块对象,PyObject_GetAttrString()来获取您关心的类型对象,并调用PyObject_Call*()之一来实例化它。任何你想存储指向该类型的指针的地方,你只需要一个PyObject *。在

相关问题 更多 >