python 调用c++动态库
概述
在实际的软件开发过程中,我们经常会有需要使用到 C++ 编写的动态库的情况。而 Python 作为一门简洁、高效的脚本语言,也经常需要调用 C++ 动态库来实现更底层的功能。本文将介绍如何使用 Python 调用 C++ 动态库,并展示一些示例代码和运行结果。
准备工作
在开始之前,我们需要确保系统中已经安装了以下软件:
- Python 3.x
- C++ 编译器(比如 g++)
- CMake(用于生成动态库文件)
创建 C++ 动态库
首先,我们需要编写一个简单的 C++ 程序,并将其编译成动态库。下面是一个简单的示例代码 hello.cpp
:
#include <iostream>
extern "C" {
void say_hello() {
std::cout << "Hello from C++ dynamic library!" << std::endl;
}
}
接着,我们可以使用 CMake 来生成动态库文件。创建一个 CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.5)
project(hello)
set(CMAKE_CXX_STANDARD 11)
add_library(hello SHARED hello.cpp)
然后执行以下命令来生成动态库文件:
mkdir build
cd build
cmake ..
make
编译完成后,会在 build
目录下生成 libhello.so
文件,这就是我们的 C++ 动态库文件。
使用 Python 调用动态库
接下来,我们将使用 Python 来调用刚刚生成的 C++ 动态库文件。首先,我们需要创建一个 Python 脚本 test.py
:
import ctypes
# Load the dynamic library
lib = ctypes.CDLL('./build/libhello.so')
# Call the C++ function
lib.say_hello()
在该 Python 脚本中,我们使用 ctypes
模块加载了刚刚生成的动态库文件,并通过 lib.say_hello()
来调用 C++ 动态库中的 say_hello()
函数。
现在,我们可以运行该 Python 脚本来测试我们的调用情况:
python test.py
运行结果将会输出:
Hello from C++ dynamic library!
传递参数和返回值
除了简单的函数调用之外,我们还可以在 Python 脚本中传递参数给 C++ 动态库,并接收返回值。下面我们来实现一个简单的加法函数。首先,修改 C++ 程序 hello.cpp
:
#include <iostream>
extern "C" {
int add(int a, int b) {
return a + b;
}
}
然后修改 Python 脚本 test.py
:
import ctypes
# Load the dynamic library
lib = ctypes.CDLL('./build/libhello.so')
# Define the types of the function
lib.add.restype = ctypes.c_int
lib.add.argtypes = [ctypes.c_int, ctypes.c_int]
# Call the C++ function
result = lib.add(3, 5)
print("The result of adding 3 and 5 is:", result)
通过 lib.add.restype
和 lib.add.argtypes
分别定义了函数的返回值类型和参数类型。运行 Python 脚本后,将会输出:
The result of adding 3 and 5 is: 8
结语
本文介绍了如何使用 Python 调用 C++ 动态库,并展示了一些示例代码和运行结果。