Python调用C++代码
今天在研究PyTorch中Tensor的一些操作的时候,发现其底层Tensor的操作都是用C++写的,并使用pybind11进行C++和Python的桥接。所以,我就想着探索一下Python中如何调用C++代码?
可行方案
其实,方案还是挺多的:
- Python内置的ctypes接口(可以将C/C++代码编译为动态库,在Python中进行调用)
- CFFI(提供了一种在Python代码中混合C代码的途径)
- Cython (C后端版本的Python实现,建立了Python类型和C语言之间的映射关系,提供了使用Python代码调用C函数库的能力)
- Boost.Python (提供手动导出C++代码接口的能力供Python调用)
- SWIG(不止支持C/C++到Python的桥接,SWIG支持很多语言跟C/C++的桥接,是广泛使用的一种解决方案)
Hello Word示例
感觉ctypes简单很多,对于小型程序感觉还是挺友好的,所以该篇博客介绍一下使用ctypes调用C/C++的步骤。
编写C或者C++代码
头文件(test.h)
1 | int sum(int, int); |
C++代码(test.cpp)
1 | // Windows需要__declspec(dllexport)申明 |
或者C代码(test.c)
1 | // 同样的Windows在函数前面需要__declspec(dllexport)申明 |
C代码编译成动态链接库
我使用的是macOS,选择使用gcc进行编译gcc -Wall -Wextra -O -ansi -pedantic -shared test.c -o test.so
在Python中调用
1 | In [1]: from ctypes import cdll |