python调用c++函数
python调用c++函数
当我们需要在Python中使用C++编写的函数时,可以将C++代码编译成共享库文件(.so文件),然后来调用这些函数。这里介绍两种方法。
使用python的api
首先要安装安装python-dev 和cmake
在Archlinux下yay python-dev
,yay cmake即可。其他平台需要自行搜索
首先创建一个C++文件 main.cpp 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include <Python.h>
  
int add(int a, int b) {
	return a + b;
}
  
static PyObject* py_add(PyObject* self, PyObject* args) {
	int a, b;
	if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
		return NULL;
	}
	int result = add(a, b);
	return PyLong_FromLong(result);
}
  
static PyMethodDef module_methods[] = {
	{"add", py_add, METH_VARARGS, "Add two integers."},
	{NULL, NULL, 0, NULL}
};
  
static struct PyModuleDef module_def = {
	PyModuleDef_HEAD_INIT,
	"my_module",
	"My custom module.",
	-1,
	module_methods
};
  
PyMODINIT_FUNC PyInit_my_module(void) {
	return PyModule_Create(&module_def);
}
接着用cmake构建.so文件,CMakeLists.txt
内容如下 1
2
3
4
5
6
7
8
9
10
11
12
13cmake_minimum_required(VERSION 3.0)
  
project(my_module)
  
find_package(Python REQUIRED COMPONENTS Interpreter Development)
  
add_library(my_module SHARED main.cpp)
  
target_include_directories(my_module PRIVATE ${Python_INCLUDE_DIRS})
target_link_libraries(my_module PRIVATE ${Python_LIBRARIES})
  
set_target_properties(my_module PROPERTIES PREFIX "")
set_target_properties(my_module PROPERTIES SUFFIX ".so")
构建完成后会有一个名为my_module.so 的文件
接下来使用python调用,注意将python文件和my_module.so
放到同一个目录下 1
2
3
4import my_module
  
result = my_module.add(1, 2)
print(result)
按照 C 语言的规则来编译和链接
首先,我们需要编写一个C++文件mylib.cpp 1
2
3extern "C" int add(int a, int b) {
    return a + b;
}
接下来,编译mylib.cpp 为一个.so文件
1
g++ -shared -o mylib.so -fPIC mylib.cpp
最后使用python加载mylib.so 文件并调用 1
2
3
4
5
6
7import ctypes
# 加载共享库文件
mylib = ctypes.cdll.LoadLibrary('./mylib.so')
result = mylib.add(1, 2)
print(result)