2011-12-02 53 views
1

由于API的内在可调用特性,是否可以使用C或C++编写的API始终作为源代码编译为库,并且因此可以从Python中调用?作为Python扩展模块的C++ API

换句话说,给定一个C/C++ API,你可以在源代码上使用distutils运行setup.py脚本,并有效地使用Python程序中的C/C++ API?

+0

那么,源代码将被手动修改使用distutils。我将尝试这些建议并返回以选择答案。 – Stephen

回答

1

这比运行setup.py脚本涉及的多一点,但有些工具可以打包C/C++库,以便您可以在Python中使用它们。一些流行的是:

  • Cython - 你编写Python风格的代码,但你可以cimport C库和调用它们的函数。然后将Cython代码翻译为C并编译。有一个名为cython-codegen的不受支持的工具可以自动编写简单的包装。
  • boost.python - 用于封装C++库。
  • SWIG
  • ctypes - 加载编译的库并直接从Python调用它们。 ctypesgen试图根据头文件自动编写一个包装。

某些项目使用其他工具来生成Python绑定,他们可能会重复使用(通过不同的努力)。 PyQt4使用SIP,PySide(另一个Qt结合)具有shiboken和GTK等人。有Gobject introspection

+1

对于那些决定为此使用Cython的人,我实际上写了一篇关于它的小文章,内容涵盖了从编写Cython源文件到编写它们的所有细节,编写setup.py - 基本上是包装C/C++库所需的一切用Python的Cython:http://martinsosic.com/development/2016/02/08/wrapping-c-library-as-python-module.html – Martinsos

0

没有将C++ API绑定到Python的内在或自动机制。它必须手动完成。我见过的最好的工具是Boost Python。

当然,考虑到C++面向对象编程和Python OO代码之间的清晰映射,创建一个解析C++头文件并产生绑定声明的脚本应该不会太困难。 GCC-XML将为您提供经过分析的头文件的xml表示形式,可以通过python脚本轻松查询该脚本来生成绑定。也就是说,可能有很多我没有预料到的细节可能会妨碍这种方法的发挥。