python调用c++函数

发布时间 2023-11-26 16:46:03作者: studyinglover1
title: python调用c++函数
banner_img: https://proxy.thisis.plus/202306281933716.png
date: 2023-7-15 9:30:00
categories:
- 踩坑

python调用c++函数

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

使用python的api

首先要安装安装python-devcmake

在Archlinux下yay python-devyay cmake即可。其他平台需要自行搜索

首先创建一个C++文件 main.cpp

#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 内容如下

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 放到同一个目录下

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

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

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

extern "C" int add(int a, int b) {
    return a + b;
}

接下来,编译mylib.cpp 为一个.so文件

g++ -shared -o mylib.so -fPIC mylib.cpp

最后使用python加载mylib.so 文件并调用

import ctypes

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

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