繁体   English   中英

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

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

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

我不知道该采取哪种策略。 我想出了两个:

作为纯Python扩展

按照官方文档中的描述编写Python C扩展。 这里的问题是我不知道如何链接自己的库和标头。 要进行编译,我编写了一个setup.py文件并运行python3.4 setup.py build 我不知道我是否可以在前一个命令中包含一些选项,或者是否可以在setup.py中编写一些内容来包含我的标头和二进制文件(如果这样,我还必须担心是否需要进行此分配?)。

与ctypes

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


另外,我尝试了第二种方法,但无法从ctypes成功获取自定义PyTypeObject。 如果第二种方法对SO方面的任何其他专家来说听起来不错,我将发布代码以获取任何帮助=)。

第二种方法也产生分配问题。 而且,如果您使用C创建Python对象,则应在模块上下文中进行操作。 对于分发有问题的方案,您可以改为静态链接此模块。

对于链接方面的问题,您可以在文档中找到有关“ 库”选项的更多信息。 由于您的库位于应在标准库搜索路径中的目录中,因此您只需要使用Extension类的“ libraries选项来定义库:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM