Python专题, 语言

Python和C++语言的混合编程

这里使用 pybind11 来实现 python 和 C++ 语言的混合编程。pybind11 是一个轻量级的 ​​C++ 库​​,用于将 C++ 代码暴露为 ​​Python 模块​​。它通过简洁的语法实现了 C++ 和 Python 之间的无缝互操作,特别适合为高性能的 C++ 代码提供 Python 接口。GitHub 链接为:https://github.com/pybind/pybind11

安装 pybind11:

pip install pybind11

检查是否存在 g++ 环境:

g++ --version

如果不存在,g++ 环境的安装可以参考这篇:Linux系统中gcc/g++/gfortran环境的安装

下面是一个学习的例子。

C++ 代码 example.cpp 内容为:

#include <pybind11/pybind11.h>

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

PYBIND11_MODULE(example, m) {
    m.def("add", &add, "A function that adds two numbers");
    m.def("hello", []() {
        return "Hello from C++!";
    });
}

安装文件 setup.py 内容为:

from setuptools import setup, Extension
import pybind11

setup(
    name='example',
    ext_modules=[
        Extension(
            'example',
            ['example.cpp'],
            include_dirs=[pybind11.get_include()],
            language='c++',
            extra_link_args=['-static-libstdc++'],
        ),
    ],
)

说明:

  • name='example':指定模块的名称为 example,安装后可以通过 import example 使用。
  • ext_modules:是一个列表,包含要编译的扩展模块配置(这里是 Extension 对象)。
  • Extension 中的 ​​'example'​​:扩展模块的名称,必须和 name 一致。
  • Extension 中的 ​​['example.cpp']​​:指定要编译的 C++ 源文件(这里只有一个 example.cpp)。
  • ​Extension 中的 ​include_dirs​​:指定头文件的搜索路径。pybind11.get_include() 会返回 pybind11 的头文件路径,确保编译器能找到 pybind11.h。
  • ​​​Extension 中的 language='c++'​​:强制使用 C++ 编译器(而不是 C 编译器)
  • Extension 中的 extra_link_args=['-static-libstdc++']​​ 告诉链接器静态链接 C++ 标准库(libstdc++),避免运行时依赖系统动态库的版本问题。如果没有 libstdc++ 相关的报错,这一行不一定要加上。

运行命令:

python setup.py build_ext --inplace

说明:

  • build_ext:这是 setuptools/distutils 的一个子命令,专门用于构建扩展模块(通常是用 C/C++ 写的 Python 扩展)。
  • --inplace:这个选项告诉构建系统将编译好的扩展模块直接放在源代码目录中,而不是安装在 Python 的 site-packages 目录里。

编译后得到文件:example.cpython-39-x86_64-linux-gnu.so。如果编译出现错误,有可能是系统的 gcc/g++ 版本比较低,可以考虑安装更高版本的。

Python 代码 a.py 内容为​​:

import example

print(example.hello())
print(example.add(3, 5))

运行 Python 程序:

python a.py

运行结果:

Hello from C++!
8
13 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code