gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:50:04 25 4
gpt4 key购买 nike

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

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

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

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

真的是这样吗?如果你想从 Python 访问它,你必须糟糕地/根本没有结构化你的代码吗?

编辑:

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

特别是,我使用的文档章节是 the build instructions , how to call C libraries , the language basicshow to cast types, particularly pointers .

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

最佳答案

实际上并不要求模块初始化函数是模块中唯一的非静态符号。它更像是一种最佳实践,可以防止污染 C 用于运行时符号的平面命名空间。另一种常见的方法是在所有导出的符号上放置特定于库的前缀。尽管通常认为仅静态方法更清晰、更健壮,但您可以执行任何一种操作。

关于python扩展模块初始化 - 多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5008007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com