python扩展模块初始化-多个文件

teh*_*rus 6 python static cpython

创建了一个由许多源文件和头文件组成的 C 库后,我现在需要用 Python 层包装它,以便我可以“导入”它。

我已经实现了从 Python 调用的静态方法,并且我需要指定模块应向解释器公开哪些方法。

然而,在指定可以调用的内容时,文档似乎只处理具有单个源文件的非常简单的情况,因为唯一的非静态方法必须是 init,它注册方法。

据我所知,如果其他源文件中的方法在 C 中声明为静态,则不可能调用它们(如果我错了,请纠正我),因此,每个 python 模块只能有一个 C 文件,因为整个过程中只允许使用一种非静态方法。

事实真的如此吗?如果你想从 Python 访问你的代码,你的代码结构必须很糟糕/根本不需要吗?

编辑:

因此,我最终实现此目的的方法是使用Cython。重写 c/python 接口不仅需要大约一个小时(由于所有引用计数规则等原因,之前需要大约一天的时间),而且它还为您处理所有构建问题,并且有清晰的文档准确描述了哪些问题方法可以从 python 获得。

特别是,我使用的文档章节包括构建说明如何调用 C 库语言基础知识以及如何转换类型(尤其是指针)

对于任何想要将现有的复杂结构 C 代码(即不仅仅是单个文件的代码)包装为 python 库的人,我强烈推荐 Cython。

Ale*_*ler 2

使用头文件使编译器可以访问外部函数。这不是一个与 Python 相关的问题,而是 C 语言中的一个常见问题。

my_prototypes.h

  // declare the prototype. everybody who includes `my_prototypes.h` now knows that it exists.
  PyObject *func_from_other_module(PyObject *self, PyObject *args);
Run Code Online (Sandbox Code Playgroud)

另一个单元.c

  PyObject *func_from_other_module(PyObject *self, PyObject *args) {
    // actual implementation
  }
Run Code Online (Sandbox Code Playgroud)

主单元.c

  #include "my_prototypes.h"

  static PyMethodDef SpamMethods[] = {

    {"func_from_other_module",  func_from_other_module, METH_VARARGS,
      "Blabla"},
    ...
   {NULL, NULL, 0, NULL}        /* Sentinel */
  }
Run Code Online (Sandbox Code Playgroud)

你是对的,如果声明了一个函数static,它只能从它包含的文件中使用。你不需要这个 - 只需将其保留即可static(基本上,你甚至不需要标题:将函数放置在作品顶部的声明mainunit.c也是如此)。