teh*_*rus 6 python static cpython
创建了一个由许多源文件和头文件组成的 C 库后,我现在需要用 Python 层包装它,以便我可以“导入”它。
我已经实现了从 Python 调用的静态方法,并且我需要指定模块应向解释器公开哪些方法。
然而,在指定可以调用的内容时,文档似乎只处理具有单个源文件的非常简单的情况,因为唯一的非静态方法必须是 init,它注册方法。
据我所知,如果其他源文件中的方法在 C 中声明为静态,则不可能调用它们(如果我错了,请纠正我),因此,每个 python 模块只能有一个 C 文件,因为整个过程中只允许使用一种非静态方法。
事实真的如此吗?如果你想从 Python 访问你的代码,你的代码结构必须很糟糕/根本不需要吗?
编辑:
因此,我最终实现此目的的方法是使用Cython。重写 c/python 接口不仅需要大约一个小时(由于所有引用计数规则等原因,之前需要大约一天的时间),而且它还为您处理所有构建问题,并且有清晰的文档准确描述了哪些问题方法可以从 python 获得。
特别是,我使用的文档章节包括构建说明、如何调用 C 库、语言基础知识以及如何转换类型(尤其是指针)。
对于任何想要将现有的复杂结构 C 代码(即不仅仅是单个文件的代码)包装为 python 库的人,我强烈推荐 Cython。
使用头文件使编译器可以访问外部函数。这不是一个与 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也是如此)。
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |