目录
1. 简介:
在C++中提供Python接口(也称为绑定),它们允许你将C++代码暴露给Python使用,以便可以在Python脚本中直接调用C++的函数和对象。
2. 常用工具及对比
主流工具主要有:pybind11, boost.python, Cython, cffi, SWIG, ctypes
每种方法都有其优势和适用场景:
- 如果你已经在使用 C++11 或更新的标准,并且想要一个简单直接的方法来创建Python绑定,pybind11 很可能是最适合的选择。
- 如果项目已经依赖Boost库,使用Boost.Python可能更方便。
- 如果需要同时支持多个语言绑定,则SWIG可能是一个好选择。
- Cython非常适合同时需要编写Python代码和C拓展的情况。
- cffi和ctypes则是较为轻量级的解决方案,不需要额外的编译步骤。
pybind11与boost.python更多维度的对比:pybind11与boost.python多维度对比
2.1 pybind11
pybind11是一个轻量级的、非侵入式的库,用于在C++和Python之间创建绑定。它可以让你轻松地将C++代码暴露为Python模块,以便可以在Python环境中调用C++函数和类。
简单参考示例:
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
PYBIND11_MODULE(example, m) {
m.def("add", &add, "A function which adds two numbers");
}
2.2 Boost.Python
Boost.Python 是一个非常成熟的库,是早期将C++绑定到Python的主要方式之一。它是Boost库的一部分,这是一个广泛使用的、高质量的C++库集合。
Boost.Python通常需要较大的运行时,并且编译配置比较复杂,但它提供了很多高级特性。
简单参考示例:
#include <boost/python.hpp>
char const* greet() {
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext) {
using namespace boost::python;
def("greet", greet);
}
2.3 Cython
Cython 是一个编程语言,也是一个优秀的工具,它允许C和C++代码被直接嵌入到Python源文件中。它然后编译成Python扩展模块,使得调用C/C++代码就像调用Python代码一样简单。
Cython还能提高纯Python代码的运行速度,因为它能将Python代码转换成C代码编译。
简单参考示例:
# example.pyx
cdef extern from "example.h":
int add(int a, int b)
def py_add(int a, int b):
return add(a, b)
2.4 cffi
cffi(C Foreign Function Interface for Python) 允许从Python代码调用C代码。它支持调用已经编译好的任何C库函数,并且能处理C数据结构。
简单参考示例:
from cffi import FFI
ffi = FFI()
# 假设我们有下面的C函数声明
ffi.cdef("""
int add(int a, int b);
""")
# 加载库(这里假设你已经有了对应的动态链接库)
C = ffi.dlopen("path/to/libexample.so")
# 现在我们可以调用C函数
result = C.add(1, 2)
2.5 ctypes
ctypes 是Python的内置库,允许从Python调用动态链接或共享库中的函数。
简单参考示例:
from ctypes import CDLL, c_int
# 加载动态链接库
lib = CDLL("path/to/libexample.so")
# 调用函数
lib.add.argtypes = (c_int, c_int)
lib.add.restype = c_int
result = lib.add(1, 2)
2.6 SWIG
SWIG是一个代码生成器,用于将C和C++扩展到各种高级编程语言,包括Python。SWIG读取你的C/C++声明并创建所需的扩展代码。SWIG会为你的C/C++代码生成必要的Python绑定代码。
简单代码示例:
/* example.i */
%module example
%{
extern int add(int a, int b);
%}
extern int add(int a, int b);