多文件 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.c
和 my_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 上才会真正改变。
目前,我正在尝试编写 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.c
和 my_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 上才会真正改变。