python调用c++函数

python调用c++函数

当我们需要在Python中使用C++编写的函数时,可以将C++代码编译成共享库文件(.so文件),然后来调用这些函数。这里介绍两种方法。

使用python的api

首先要安装安装python-devcmake

在Archlinux下yay python-devyay 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
13
cmake_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
4
import my_module

result = my_module.add(1, 2)
print(result)

按照 C 语言的规则来编译和链接

首先,我们需要编写一个C++文件mylib.cpp

1
2
3
extern "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
7
import ctypes

# 加载共享库文件
mylib = ctypes.cdll.LoadLibrary('./mylib.so')

result = mylib.add(12)
print(result)


python调用c++函数
https://studyinglover.com/2023/07/15/python调用c++函数/
作者
StudyingLover
发布于
2023年7月15日
许可协议