# 简介

多种编程语言混合开发的形式:

  • 调用可执行文件。
  • 每种语言分别运行一个进程,让它们通信、协作。(通过本机 socket 或 HTTP 协议通信)
  • 调用代码(比如调用函数、类)。

使用 CPython 解释器时,可以进行 Python 与 C/C++ 的混合开发:

  • Python 调用 C/C++ 代码的形式:
    • 把 C/C++ 代码编译成 C/C++ 的动态链接库,再被 Python 导入。
    • 把 C/C++ 代码封装成 Python 的扩展模块,再被 Python 导入。
  • C/C++ 调用 Python 代码的形式:
    • 把 Python 代码转换成 C/C++ 的动态链接库,再被 C/C++ 导入。
    • 把 Python 代码转换成 C/C++ 的源文件,再被 C/C++ 导入。

# 混合开发工具

混合开发工具有多种,选择它们时需要从多方面考虑,比如:

  • 是否支持 C/C++ 调用 Python ?或者反之?
  • 调用函数时,是把形参从 Python 的数据类型转换成 C/C++ 的数据类型吗?或者反之?
  • 进一步地,哪些数据类型可以通用?哪些数据类型不兼容?
  • 能否调用类?
  • 如果 C/C++ 代码抛出了异常,如何传递给 Python ?或者反之?
  • 能否移植到 Linux、Windows、MacOS 等多种平台?

# CPython API

  • :可以将 C/C++ 代码封装成 Python 模块,或者将 Python 代码封装成 C 代码。
  • 优点:
    • 它是 CPython 解释器自带的功能,不需要安装第三方库。
    • 它是实现 Python 混合开发的底层 API ,是其它混合开发工具的基础。
  • 缺点:
    • 使用起来很麻烦。

# ctypes

  • :Python 的标准库,允许 Python 加载 C 的动态链接库,直接调用其中的函数,或者将 Python 函数作为回调函数传给 C 函数。
  • 优点:
    • 它是 Python 自带的标准库,不需要安装第三方库。
    • 使用时不需要封装 C 代码,可以直接调用 C 的动态链接库。
  • 缺点:
    • 没有封装 C 函数,因此 Python 调用一个 C 函数时要自己转换数据类型。
    • 只支持 C 语言,处理 C++ 代码时要先封装成 C 函数。
    • 不支持 C/C++ 主动调用 Python 。

# Cython

  • :Python 的第三方库,可以将 C 代码封装成 Python 模块,或者将 Python 代码编译成 C 代码。
  • 优点:
    • 可以在 Python 中使用 C/C++ 的数据类型、函数,扩展 Python 的语法,提高 Python 程序的运行效率。

# SWIG

  • :一个编译器,可以将 C/C++ 代码封装成供 C#、Java、Python 等多种语言调用的文件。
  • 缺点:
    • 不支持 C/C++ 主动调用 Python 。

# Boost.Python

  • :一个 C++ 库,可以将 C++ 代码封装成 Python 模块,或者在 C++ 中导入 Python 模块。
  • Boost 库的使用很广,提供了一些扩展功能的 C++ 库,近乎 C++ 的标准库。

# pybind11

  • :一个 C++ 库,相当于轻量级的 Boost.Python 。
  • 优点:
    • 比较简单,使用时只需要导入一个头文件。但功能完备。
    • 对 C/C++ 代码的封装比较完善,能加上模块说明、函数说明。