C/C++与Python混合编程

打印 上一主题 下一主题

主题 996|帖子 996|积分 2988

Python与C++混合编程可以实现两种语言的优势联合,C++的程序性能很高且支持强大的体系调用本领,Python则生态丰富且开辟服从高。本章将基于Python3讲述Python与C++混合编程的技能。
1. Python简介

1.1. 什么是Python?

Python是一种高级编程语言,具有简便易读的语法和强大的功能。它于 1991 年由 Guido van Rossum 首次发布,快速发展成为一种广泛使用的编程语言。它是一种动态脚本语言,崇尚优美、清晰、简单的语法。
Python具有以下一些特性:

  • 跨平台:语言级别跨平台,几乎可以在各个平台间无缝切换,如 Windows、macOS 和 Linux等。
  • 生态丰富:拥有浩繁的标准库和第三方库,且拥有优秀的包管理机制。
  • 多范式编程: 支持多种编程范式,包括面向对象编程、过程式编程和函数式编程。
  • 应用广泛:Python 被广泛应用于科学计算、数据分析、人工智能、网络开辟、自动化测试等领域。
1.2. 常见数据类型

Python是一种动态语言,变量的界说不必要在前面加类型阐明,而且差异类型之间可以方便地相互转换。如下示例代码:
  1. a = "124"
  2. print("a:", a, "type:", type(a))
  3. b = int(a)
  4. print("b:", b, "type:", type(b))
复制代码
实行结果:
  1. a: 124 type: <class 'str'>
  2. b: 124 type: <class 'int'>
复制代码
Python3中有六个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)
  • Set(集合)
其中List、Tuple、Dictionary、Set为容器。Python支持四种差异的数字类型:int(有符号整型)、float(浮点型)、bool(布尔型)、complex(复数)。(阐明:Python3中已去除long类型,与int类型合并)。
Python具有以下常用的数据类型转换函数:
函数描述int(x [,base])将x转换为一个整数。base为可选参数,体现进制数,默认十进制。float(x)将x转换到一个浮点数complex(real [,imag])创建一个复数。imag为可选参数,体现虚数部分str(x)将对象 x 转换为字符串tuple(s)将序列 s 转换为一个元组list(s)将序列 s 转换为一个列表set(s)转换为可变集合dict(d)创建一个字典。d 必须是一个 (key, value)元组序列。frozenset(s)转换为不可变集合chr(x)将一个整数转换为一个字符ord(x)将一个字符转换为它的整数值hex(x)将一个整数转换为一个十六进制字符串oct(x)将一个整数转换为一个八进制字符串1.3. 环境阐明

本章全部的示例代码都是使用Python3举行编写,具体的环境如下:

  • 操作体系: Ubuntu 24.04
  • Python:  3.12.3
  • 开辟工具:VSCode
2. 开辟环境搭建

2.1. Windows


  • 下载最新版本的安装包,官网下载地址: https://www.python.org/downloads/
  • 点击安装包,根据提示一步一步操作即可,只必要注意以下两点:

    • 勾选Add python.exe to PATH 将Python添加到环境变量

    • 假如要自界说安装路径,第一步必要选择Customize installation(如上图所示),然后Advaned options页面选择对于的安装路径(如下图)。


  • 安装完后打开命令提示符,然后输入python -V,假如体现对应的版本号,则阐明安装成功。
2.2. Linux(Ubuntu)
  1. # 1. 更新软件包列表
  2. sudo apt update
  3. # 2. 安装python3
  4. sudo apt install python3
  5. # 3. 验证python3是否安装成功,如果显示对应的版本号则说明安装成功。
  6. python3 -V
  7. # 4. 安装python3开发包
  8. sudo apt install python3-dev
  9. # 验证python3-dev是否安装成功,如果能看到相关的包信息则说明安装成功。
  10. dpkg -l | grep python3-dev
复制代码
2.3. macOS
  1. # 前期准备:安装Homebrew
  2. # 执行`brew -v`检查Homebrew是否安装,如果未安装,执行以下命令安装
  3. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  4. # 1. 更新软件包列表
  5. brew update
  6. # 2. 安装python
  7. brew install python
  8. # 3. 验证版本号,如何显示对应的版本号则说明安装成功。
  9. python3 -V
复制代码
3. Python/C API

3.1. 什么是Python/C API?

Python/C API是Python官方提供的一套API接口,允许开辟者使用 C/C++ 语言来扩展Python。这个接口使得开辟者可以在 C/C++ 语言中编写模块,这些模块可以被 Python 程序调用,从而实行更高效的计算,或者访问操作体系级别的资源。Python/C API也支持在C/C++中调用Python的模块代码,从而实现跨语言的混合编程。
官方文档https://docs.python.org/3.8/c-api/index.html#c-api-index
3.2. C++调用Python模块

py_math.py:
  1. def add(a: int, b: int):
  2.     res = a + b
  3.     return res
  4. def sub(a: int, b: int):
  5.     return a - b
复制代码
cpp_call_python.cpp:
[code]#include #include #include int32_t add_from_python(int32_t a, int32_t b, int32_t& res){    PyObject* pModuleName = PyUnicode_FromString("py_math");    if (!pModuleName)    {        PyErr_Print();        return -1;    }    // 导入模块    PyObject* pModule = PyImport_Import(pModuleName);    if (!pModule)    {        PyErr_Print();        Py_DECREF(pModuleName);        return -1;    }    /* great_module.great_function */    PyObject* pFunc = PyObject_GetAttrString(pModule, "add");    if (!pFunc || !PyCallable_Check(pFunc))    {        PyErr_Print();        Py_DECREF(pModule);        Py_DECREF(pModuleName);        return -1;    }    // 设置参数    PyObject* pArgs = PyTuple_Pack(        2,         PyLong_FromLong(a),         PyLong_FromLong(b)    );    if (!pArgs)    {        PyErr_Print();        Py_DECREF(pFunc);        Py_DECREF(pModule);        Py_DECREF(pModuleName);        return -1;    }    // 调用函数    PyObject* pValue = PyObject_CallObject(pFunc, pArgs);    if (!pValue)    {        PyErr_Print();        Py_DECREF(pFunc);        Py_DECREF(pModule);        Py_DECREF(pModuleName);        return -1;    }    // 获取结果    res = PyLong_AsLong(pValue);    Py_DECREF(pValue);    Py_DECREF(pFunc);    Py_DECREF(pModule);    Py_DECREF(pModuleName);    return 0;}int main(){    // 1. 初始化 Python 解释器    Py_Initialize();    // 2. 调用 Python 代码    int32_t result = 0;    auto ret = add_from_python(3, 2, result);    if (ret < 0)    {        std::cerr

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表