python如何实现简单调用c++库

 更新时间:2026年03月18日 09:28:34   作者:倔强老吕  
这篇文章主要为大家详细介绍了python如何实现简单调用c++库,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下

在 Python 中调用 C++ 库,通常有以下几种方式:

1. 实现方式

1. 使用 ctypes

适用于 C 风格的函数接口。可以用于调用编译为 `.so`(Linux)或 `.dll`(Windows)的库。

步骤:

1. 将 C++ 编译为动态链接库,并使用 `extern "C"` 导出函数。

2. 在 Python 中使用 `ctypes` 加载并调用这些函数。

示例:C++ 文件 (add.cpp)

// add.cpp
#include <iostream>
extern "C" {
    int add(int a, int b) {
        return a + b;
    }
}

编译成共享库

g++ -shared -fPIC -o libadd.so add.cpp

Python 调用代码

import ctypes

# 加载 DLL/so
lib = ctypes.CDLL('./libadd.so')

# 设置参数类型和返回值类型(可选但推荐)
lib.add.argtypes = [ctypes.c_int, cypes.c_int]
lib.add.restype = ctypes.c_int

result = lib.add(3, 4)
print("Result from C++:", result)  # 输出: Result from C++ :7

2. 使用 cffi 或 c扩展模块

  • cffi: 更现代的 FFI 方法,支持 C 接口。
  • 编写 C/C++ 扩展模块:适合性能关键部分。

不如 PyBind11 简洁,这里略过。

3. 使用 PyBind11

最推荐的方式,专为 Python 和 C++ 混合编程设计,功能强大且简洁。

步骤

1. 安装 pybind11:

   pip install pybind11

2. 写一个封装了 C++ 的绑定文件。

3. 编译生成 `.pyd` 或 `.so` 文件供 Python import。

示例:C++ 文件 (example.cpp)

#include <pybind11/pybind11.h>
int add(int i, int j) {
    return i + j;
}
PYBIND11_MODULE(example, m) {
    m.def("add", &add, "A function that adds two numbers");
}

 编译方法 1:使用命令行

c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example$(python3-config --extension-suffix)

Python 调用

import example
print(example.add(3, 4))  # 输出: 7

4. 使用 SWIG

适合大型项目,但学习成本稍高。

小结

2. 使用pybind11封装一个C++类

使用 PyBind11 封装 C++ 类是一个相对直接的过程,它允许你将 C++ 类暴露给 Python 代码。下面我将展示如何使用 PyBind11 来封装一个简单的 C++ 类。

示例

假设我们有一个简单的 C++ 类 Rectangle,它有两个方法:计算矩形的面积和周长。

C++ 文件 (rectangle.cpp)```cpp

#include <pybind11/pybind11.h>
namespace py = pybind11;
class Rectangle {
public:
    Rectangle(double width, double height) : width_(width), height_(height) {}
    double area() const {
        return width_ * height_;
    }
    double perimeter() const {
        return 2 * (width_ + height_);
    }
private:
    double width_, height_;
};
PYBIND11_MODULE(rectangle_module, m) {
    py::class_<Rectangle>(m, "Rectangle") // 绑定类
        .def(py::init<double, double>()) // 绑定构造函数
        .def("area", &Rectangle::area) // 绑定成员函数
        .def("perimeter", &Rectangle::perimeter); // 绑定成员函数
}

在这个例子中:

  • py::class_<Rectangle> 定义了要暴露给 Python 的 C++ 类。
  • .def(py::init<double, double>()) 指定了如何创建这个类的对象(即它的构造函数)。
  • .def("area", &Rectangle::area) .def("perimeter", &Rectangle::perimeter) 分别绑定了类的方法 area 和 perimeter 到 Python 中。

Python 调用

一旦编译完成,你就可以像导入任何其他 Python 模块一样导入并使用这个新模块:

import rectangle_module

rect = rectangle_module.Rectangle(5, 4)
print(f"Area: {rect.area()}") # 输出: Area: 20
print(f"Perimeter: {rect.perimeter()}") # 输出: Perimeter: 18

3.Windows 上配置环境

准备工作

1. 安装 Visual Studio:确保你已经安装了 Visual Studio,并且包含“使用 C++ 的桌面开发”工作负载。

2. 安装 Python:下载并安装适合你项目的 Python 版本。

3.下载Pybind11库,这是一个仅包含头文件的轻量级库,使用起来非常方便。可以在Github下载其Release版本 pybind11    可以参考:官方文档

配置 Visual Studio 项目

1. 创建一个新的空项目。

2. 添加源文件:将上述 C++ 代码保存为 `example.cpp` 并添加到你的 Visual Studio 项目中。

3. 配置项目属性

  • C/C++ -> 常规 -> 附加包含目录:添加 pybind11/include 的路径,以及 Python 的 include 目录。
  • 链接器 -> 常规 -> 附加库目录:添加 Python 的 lib 目录路径。
  • 链接器 -> 输入 -> 附加依赖项:添加 pythonXY.lib(其中 XY 是你的 Python 版本号,例如 python39.lib 对于 Python 3.9)。

4. 设置输出类型:右键点击项目 -> 属性 -> 配置属性 -> 常规 -> 配置类型,选择“动态库(.dll)”。

5. 编译项目:选择合适的配置(Debug 或 Release),然后编译项目。确保在项目属性中将目标扩展名设置为 .pyd(这是 Python 在 Windows 上使用的扩展名),或者生成的 .dll 文件需要重命名为 .pyd ,其才能被 Python 正确识别。

这样,你就成功地在 Windows 上使用 Python 调用了 C++ 库。通过这种方式,你可以将复杂的 C++ 功能集成到 Python 应用程序中。对于更复杂的项目或类的封装,逻辑大致相同,但可能需要更多的细节配置。

到此这篇关于python如何实现简单调用c++库的文章就介绍到这了,更多相关python调用c++库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • win10系统中安装scrapy-1.1

    win10系统中安装scrapy-1.1

    在win10的环境下安装scrapy,并不能直接按照官网的手册(http://doc.scrapy.org/en/1.0/intro/install.html)一次性安装成功,根据我自己的安装过程中遇到的问题,特意整理了一下安装过程
    2016-07-07
  • Python利用matplotlib实现制作动态条形图

    Python利用matplotlib实现制作动态条形图

    说到用 Python 制作动态图,首先想到的肯定是一些直接拿来就用的库,虽然我没做过,但是我相信一定有且不止一个,搜了一圈后发现有个bar chart race库看起来不错,感兴趣的可以跟随小编一起学习一下
    2022-10-10
  • Python清理数据的八种常用方法

    Python清理数据的八种常用方法

    在本文中,我们将介绍Python中一些常用的数据清理方法,包括数据预览、缺失值处理、异常值处理、数据类型转换、重复值处理、数据标准化、特征选择以及处理类别数据,感兴趣的可以了解一下
    2023-11-11
  • python中 ? : 三元表达式的使用介绍

    python中 ? : 三元表达式的使用介绍

    刚刚学python的时候,时常纠结于python中没有C语言中 ? : 的实现,今天终于发现了两种python的实现方式
    2013-10-10
  • 浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点

    浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点

    这篇文章主要介绍了浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • win10环境下python3.5安装步骤图文教程

    win10环境下python3.5安装步骤图文教程

    本文通过图文并茂的形式给大家介绍了win10环境下python3.5安装步骤,需要的朋友可以参考下
    2017-02-02
  • 利用Opencv实现图片的油画特效实例

    利用Opencv实现图片的油画特效实例

    这篇文章主要给大家介绍了关于利用Opencv实现图片的油画特效的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python实现运行其他程序的四种方式实例分析

    Python实现运行其他程序的四种方式实例分析

    这篇文章主要介绍了Python实现运行其他程序的四种方式,结合实例形式分析了Python执行其他程序相关模块与函数使用技巧,需要的朋友可以参考下
    2017-08-08
  • 详解pytest实现mark标记功能详细介绍

    详解pytest实现mark标记功能详细介绍

    这篇文章主要介绍了详解pytest实现mark标记功能详细介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Django ORM 常用字段与不常用字段汇总

    Django ORM 常用字段与不常用字段汇总

    这篇文章主要介绍了Django ORM 常用字段与不常用字段汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论