换言之:*.h/*.c --[??POSSIBLE??]--> *.pxd/*.pyx
行。我已经(我希望)在互联网上做了足够的挖掘 - 但我认为这是一个很好的问题所以我会直截了当地问。
有一些相关的问题(例如Generate python bindings, what methods/programs to use或Wrapping a C library in Python: C, Cython or ctypes?)但是我并没有总结我所要求的情况,这可能是为了更高级别“方法(特别是对于现有的库,不从python生成新的C)。
在使用Cython之前,我已经有了little bit的经验,我已经包装了一些代码。 Cython对速度和可维护性赞不绝口。在我的书中可以使用小/单位代码 - 但是,这次我在我的板块上有更多的东西......
继three great virtues of a programmer的第一个之后 - 我希望尽可能少地做到这一点。
所以真正的问题是如何通过.pxd和可能的.pyx文件的自动化方式来缓解创建(即节省时间而不是错误输入错误的内容)。
This here似乎是关于如何执行此操作的唯一真实提示/注释 - 但其上的大多数项目都已停止使用,旧版或sourceforge。许多人似乎只为C ++工作(这是我在这里做的)。
还有人还在使用它们吗?最近?有没有人有这样的工作流程或最佳实践?我只是手动做得更好吗?
我的库由一组头文件很好地定义。一个包含所有C结构/类型的defs,另一个包含所有函数的原型。但它是loooonnnggg ......
感谢您的任何提示。
更新(2015年8月25日):
是的,所以在过去的几个月里,当我有空闲时,我试过了:
CFFI(感谢@David指出这一点) - 有一个崇高的目标,即在不学习第三语言的情况下从Python调用C代码:现有的替代方案要求用户学习特定领域的语言(Cython, SWIG)或API(ctypes)“ - 但它不太合适,因为它涉及实际python文件中的相当程度的嵌入式C代码(或加载它)。对于大型库来说,这将是一个非常手动的过程。也许我错过了什么......
SWIG是Python绑定的祖父,非常可靠。从根本上说,它并不像我理解的那样“放手” - 即你需要一个单独的规范文件。例如,您必须编辑所有C头文件以指示使用#define SWIG_FILE_WITH_INIT
构建python模块或使用其他注释。 SIP在这里也有同样的问题。您不会从标题中自动生成,您可以修改它们以包含您自己的指令和注释,并创建完整的规范文件。
cwrap - 我在Mac上,所以我用这个版本来铿锵。 https://github.com/geggo/cwrap真的很差的文档 - 但是使用源码我终于让它运行并且它生成了....一个非常简单的结构头的空的.pyx文件。不太好。
xdress - 这表明了承诺。该网站已关闭,因此文档实际上似乎here。这里有大量的工作,看起来很简单。但是它需要所有的llvm头文件(以及一个正确链接的clang版本)。我不得不使用brew install llvm —with-clang
。有一个xdress clang-3.5
分支,但它似乎没有完成足够的修复。我尝试为早期版本的clang(安装llvm33 / llvm34)点击自制软件/版本并将其构建完成。无论如何,我离题......它对于一个简单的例子非常有用,但是完整库的结果ctypes文件非常混乱并且拒绝构建。 AST C-> Python中的东西有点不对......
ctypesgen不是我在原始搜索中遇到的那个。文档很稀疏 - 或者你可以称之为简洁。在过去的4年中,它似乎也没有做过多少工作(如果开发人员要进一步推进该项目,那么人们会询问问题列表)。我已经尝试过运行它,但遗憾的是,它似乎与我怀疑/似乎与Clang编译器cdefs.h使用_attribute_
的问题有关。我尝试了-std=c11
之类的东西,但无济于事。
总之,在我看过的所有内容中,我认为xdress最接近全自动生成的python绑定。它对于给出的简单示例工作得很好,但无法处理更复杂的现有库头,前向声明,枚举类型,void 指针的所有复杂性...它似乎是一个设计良好的(一段时间)维护良好的项目,如果有人再次接受它,可能有一些方法可以解决这些问题。
然而,问题仍然存在,是否有人有一个强大的工具链来自动生成C头的python包装器?我认为现实总是需要进行一些手工操作,因为CFFI看起来是最“现代”的方法(我遇到的最好的概述/比较之一是here) - 但它总是涉及到任何头文件的特别编辑cdef()
版本(例如Using Python's CFFI and excluding system headers)。