0

我正在使用 Python C API 并尝试创建一个函数,该函数将分配 PyTypeObjects 的新实例以在多个 C++ 类中使用。这个想法是每个类都有一个指向 PyTypeObject 的指针,它将被这个工厂实例化。指针必须是静态的。但是,我对这种方法有疑问。

  1. 在包含指向 PyTypeObject 的指针的类中,当我尝试将该静态变量设置为等于工厂函数的结果(在另一个类中但是静态的)时,我得到“未定义的引用”链接器错误。我想这是有道理的,因为该功能要到运行时才会发生,但我不知道另一种方法可以做到这一点。
  2. 我不知道如何动态设置 PyTypeObject 字段,因为第一个字段始终是一个宏:PyObject_VAR_HEAD。

希望这是有道理的。基本上,我试图让几个类不必静态地重新定义 PyTypeObject,而是可以从工厂函数实例化它们的 PyTypeObject 变量。

4

1 回答 1

0

试试这个:创建一个“模板”PyTypeObject,并使用结构复制(或 memcpy)来克隆基本模板。然后您可以在此之后填写必要的字段定义。这解决了 (2),因为您只需声明完整的 PyTypeObject 一次。

对于您的第一点,您只需从模块 init 中设置静态变量,而不是在静态变量声明中进行设置。因此,在您的模块实际初始化之前不会设置它。

如果您打算经常这样做,可能值得一看 Boost::Python,它简化了从 C++ 类生成 CPython 包装器的过程。

于 2012-08-23T19:26:03.910 回答