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