使用外部库在 C 中创建 Python 类型:ctypes 或 setuptools?

Creating a Python type in C using an external library: ctypes or setuptools?

我正在编写某种 Python C 扩展。它使用我自己的 *.so 库和来自另一个项目的 headers(假设它们在 /usr/local/lib/otherproject.so/usr/local/include/otherproject.h 中)。

我不知道应该遵循哪种策略。我想到了两个:

作为纯 Python 扩展

按照描述 in the official docs 编写一个 Python C 扩展。这里的问题是我不知道如何 link 使用我自己的库和 headers;为了编译,我写了一个 setup.py 文件和 运行 python3.4 setup.py build。我不知道我是否可以在前一个命令中包含一些选项,或者我是否可以在 setup.py 中写一些东西来包含我的 headers 和二进制文件(如果是这样,我也将不得不担心制作这个可分发的?)。

有 ctypes

编写一个 C 库(使用我的其他项目的构建系统)。通过传递 '/usr/include/python2.7' 来包含 Python 以查找 headers 和 python2.7 二进制文件。然后使用 ctypes 环绕该库并获取函数、类型、objects 等。这里的不便之处在于我需要手动环绕 ctypes 中的每个 function/type/variable;我不认为我可以使用 PyModule_AddObject 因为我不是在 C 中而是在 Python 包装器(带有 ctypes)中创建模块。


此外,我尝试了第二种方法,但无法从 ctypes 成功获取自定义 PyTypeObject。如果第二种方法对 SO 上的任何专家来说听起来不错,我会 post 获得任何帮助的代码 =)。

第二种方法也会产生分布问题。如果你在 C 中创建一个 Python 对象,你应该在模块的上下文中进行。对于分发有问题的场景,您可以 link 静态地代替此模块。

对于 linking 的问题,您可以在文档中找到有关 Library options 的更多信息。由于您的库位于标准库搜索路径中的目录中,因此您只需要使用 Extension class:[=16 的 libraries 选项定义您的库=]

mymodule_ext = Extension('mymodule', ['mymodule.c'], libraries=['otherproject'])

如果您不使用标准的 lib* 前缀,则需要使用 libraries=[':otherproject.so']