多文件 C Python 扩展组织问题

Multifile C Python Extension Organization Issue

目前,我正在尝试编写 C Python 扩展。具体来说,我正在尝试创建一个 python 模块,其中包含几个 classes。基本上,我希望它看起来像这样:

my_module
     class foo
     class bar

这是我现在正在使用的一些背景信息。

到目前为止,我的源代码树看起来像这样:

src/
    my_module_main.c
    my_module_defs.h
    my_module_foo.c
    my_module.bar.c

文件my_module_main.c包含模块初始化。这包括 initmy_module 函数,每个 class 的我的 PyTypeObjects 的定义,以及它们对应的方法表。

文件my_module_defs.h包含函数和类型的所有定义。它包含

typedef struct {
    PyObject_HEAD
    ...
} foo;

还有对象定义。

my_module_foo.cmy_module_bar.c 文件都包含每个 classes 的函数定义。这些文件包含这些函数使用的实际函数(即分配器、构造函数、析构函数和方法)。

现在解决我的实际问题。

我在这个项目中尝试做的一件事是访问 class 结构的底层对象(其中包含 PyObject_HEAD 的结构)。为此,您需要使用 PyTypeObject 结构。但是,该对象位于 my_module_main.c 中并被声明为静态的,因此在我的其他 C 文件中无法访问它。

我的问题是:有没有办法可以跨多个源文件共享这个 PyObjectType?我必须将事物声明为 extern 吗?我知道我可以将整个模块放入一个源文件中,但这会很痛苦,因为文件太大并且要处理的内容太多。

感谢您的帮助。如果我的设置有任何明显的问题,请随时发表评论,因为我是这个过程的新手并且可以使用一些指示。谢谢!

CPython 实现为其自己的 API 类型处理此问题的方式是在其 C 文件中定义类型对象(就像您拥有的那样),然后在其头文件中将其类型对象 extern。例如,对于浮动对象,您有:

floatobject.h

#ifndef Py_FLOATOBJECT_H
#define Py_FLOATOBJECT_H

...

PyAPI_DATA(PyTypeObject) PyFloat_Type;

...

#endif

floatobject.c

PyTypeObject PyFloat_Type = {
    ...
};

其中 PyAPI_DATA 具有简单的默认实现(在 Include/pyport.h 中):

#define PyAPI_DATA(RTYPE) extern RTYPE

只有在 windows 上才会真正改变。