gpt4 book ai didi

python - Cython 中包含一个较大的 C 库

转载 作者:行者123 更新时间:2023-11-30 17:17:04 26 4
gpt4 key购买 nike

我对 Cython 非常陌生,并且了解 C/C++ 编译的基础知识。

这就是我正在尝试做的事情:

有一个用 C 语言编写的相当大的库,我想将其合并到我的 Python 程序中。 (特别是,它是 GNUGo 棋盘逻辑的实现。我正在尝试为其构建 AI。)我需要这个例程快速,而使用该逻辑的 Python 实现太慢了。

Cython 文档说我应该创建一个 .pxd 文件,其中列出从 .h 文件外部定义的方法签名。然后,我应该在相应的 .pyx 文件中创建一个包装类,并手动创建与上面列出的方法签名 Hook 的 Python 端函数调用。

我遇到的问题是我想要实现的库不是像文档示例那样的单个 C 文件。它使用多个具有相互依赖性的 C 文件,并且游戏板表示为一组全局变量,这些变量在各处都被外部定义。我真的、真的不想为所有必需的 C 文件编写 .pxd

GNUGo 文档建议我可以创建一个 libboard.a 文件 - 这在概念上与 .o 文件不同吗?有没有办法包含该文件进入 Cython?理想情况下,我希望将其视为一个黑盒,让我可以进行方法调用,让库处理其疯狂的全局变量,并返回所需的输出。

最佳答案

我不确定这是否是“正确”的方法,但这是我如何让它工作的。

在我的go.pxd文件中,我从头文件 board.h 中列出了我需要的所有方法声明。而不是做

cdef extern from "board.h":
...

我愿意

cdef extern:
...

因为我不想实际包含 board.h 文件 - 我有库 libboard.a反而。在该 block 内,我列出了我需要的所有方法。

在我的go.pyx文件,我做cimport go ,然后执行 go.method_name(args)每当我需要使用它时。在 go.pyx 上运行 Cython生成go.c工作文件,因为所有方法都已定义 extern .

最后,将其变成go.so要导入的库,我有一个基本上可以执行的 Makefile

gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing \
-I/usr/include/python2.7 go.c libboard.a -o go.so

最后的go.so可在 Python 中导入并且工作正常。

棘手的部分是我需要重新编译 libboard.a-fPIC在链接之前。我还需要删除一些对curses.h/term.h 的库调用,因为我无法让这些包含工作,但幸运的是我并不需要 pretty-print 。

一般来说,您似乎应该能够链接任意 .o.a最后一步中的声明,只要您不指定它们的位置 extern来自.pxd文件。这似乎很快就会变得非常困惑,但至少它有效。

关于python - Cython 中包含一个较大的 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29480418/

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