python运行c++

Python与C++混合编程完全指南

为什么需要Python与C++结合?

Python和C++混合编程结合了两者的优势,在保持Python开发效率的同时,利用C++实现性能关键部分的加速。

优势 说明
性能提升 C++执行效率远超Python
复用现有代码 利用已有C++库避免重写
系统级访问 突破Python在系统编程的限制
并行计算 更好的多线程/GPU支持
内存控制 精细管理内存使用

基础交互方式

方法对比

方法 难度 性能 适用场景
ctypes 简单 调用简单C函数
CFFI 中等 需要灵活性的场景
SWIG 中等 大型项目,多语言支持
pybind11 中等 现代C++项目
Boost.Python 复杂 复杂C++项目
Cython 中等 科学计算,已有Python代码

ctypes - 调用C函数

C++代码示例

// math_funcs.cpp
extern "C" {
   
   
    int add(int a, int b) {
   
   
        return a + b;
    }
    
    double multiply(double a, double b) {
   
   
        return a * b;
    }
}

编译为共享库:

g++ -shared -fPIC -o libmath.so math_funcs.cpp

Python调用代码

import ctypes

# 加载共享库
math_lib = ctypes.CDLL('./libmath.so')

# 调用C函数
result = math_lib.add(5, 3)
print(f"5 + 3 = {
     
     result}")

# 指定参数和返回类型
math_lib.multiply.argtypes = [ctypes.c_double, ctypes.c_double]
math_lib.multiply.restype = ctypes.c_double
result = math_lib.multiply(2.5, 4.0)
print(f"2.5 * 4.0 = {
     
     result}")

代码解释:

  1. extern "C"避免C++名称修饰
  2. -shared -fPIC生成位置无关代码
  3. argtypesrestype确保类型安全
  4. 适合简单C函数调用

pybind11 - 现代C++绑定

安装pybind11

pip install pybind11

C++模块示例

// example.cpp
#include <pybind11/pybind11.h>

namespace py = pybind11;

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

PYBIND11_MODULE(example, m) {
   
   
    m.doc() = "pybind11示例模块";
    m.def("add", &add, "两个整数相加");
}

编译命令:

g++ -O3 -Wall -shared -std=c++11 
### 如何在 Linux 系统中通过 Python 执行 C++ 代码 #### 编写并编译 C++ 动态库 为了使 Python 能够调用 C++ 代码,在 Linux 下通常会先创建一个动态共享对象(`.so` 文件),这可以通过编写一段简单的 C++ 代码实现。 假设有一个名为 `example.cpp` 的源文件: ```cpp extern "C" { #include <string.h> #include <stdio.h> void hello(const char* name) { printf("Hello %s\n", name); } } ``` 接着,使用 g++ 将其编译成 `.so` 库。注意 `-fPIC` 和 `-shared` 参数用于指示生成位置无关代码以及构建共享目标文件[^2]。 ```bash g++ -o libexample.so -fPIC -shared example.cpp ``` #### 创建 Python 接口脚本 有了上述的 `.so` 文件之后,可以借助于 Python 中的 ctypes 模块加载该库,并定义相应的函数原型以便正确调用其中的方法。 下面是一个例子展示怎样在一个叫做 `call_cpp.py` 的 Python 文件里完成这项工作: ```python from ctypes import CDLL, c_char_p # 加载我们之前制作好的 .so 文件作为 DLL 对象 lib = CDLL("./libexample.so") # 设置参数类型;这里只传递了一个字符串指针给 C 函数 lib.hello.argtypes = [c_char_p] if __name__ == "__main__": # 实际上传递给 C 函数的数据应该是 bytes 类型而非 str, # 因此需要转换一下编码格式 message_bytes = b"World" # 调用来自 C++ 的功能 lib.hello(message_bytes) ``` 当运行这段 Python 代码时,应该能看到终端打印出 `"Hello World"` 这样的消息,证明成功实现了跨语言调用[^4]。 #### 解决可能遇到的问题 有时可能会碰到缺少特定版本的标准 C++ 库的情况,例如错误提示类似于 `/usr/lib64/libstdc++.so.6: version 'GLIBCXX_X.X.XX' not found` 。这时可通过更新系统的 GNU 标准 C++ 库来解决问题,或者考虑调整程序依赖关系以适应当前环境中已有的库版本[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小玗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值