c++ 调用python_Python与C交互概述

1.Python与C交互概述

Python与C/C++交互的三种方式

  • Python扩展:在Python程序中调用C/C++编写的库
  • Python嵌入:在C/C++程序中调用Python程序
  • Python调用:Python和C间以程序级别互相调用

Python与C/C++交互的价值

  • 整合Python高产与C/C++高效的优势
  • 利用C或Python已有功能服务彼此的程序
  • Python作为粘性脚本语言整合或被整合到各类独立程序

Python扩展:在Python程序中调用C/C++编写的库

  • 目的:提升关键代码性能、引入C语言成熟功能库
  • 方式:Cython、SWIG、ctypes、CFFI
  • 形式:Python为主程序,C通过.dll/.so形式使用

Python嵌入:在C/C++程序中调用Python程序

  • 目的:利用Python高产、引入Python成熟功能库
  • 方式:Python/C API
  • 形式:C/C++为主程序,Python通过源文件形式使用

Python调用:Python和C间以程序级别互相调用

  • 目的:模块间功能互用,以功能使用为目标
  • 方式:子进程或线程方式,即subprocess
  • 形式:C/C++和Python都是独立程序

小结:Python与C/C++交互的三种方式

  • Python扩展:十分重要,Python程序员必学必会
  • Python嵌入:一般重要,Python程序员可以掌握
  • Python调用:比较重要,Python程序员应该掌握

2.Python的扩展方法

  • 目的:提升关键代码性能、引入C语言成熟功能库
  • 方式:Cython、SWIG、ctypes、CFFI
  • 形式:Python为主程序,C通过.dll/.so形式使用

Cython:实现Python扩展的一种语言,第三方库

  • 思路:通过一种简单的语言来实现Python和C的接口
  • 方式:采用了Pyrex语法形式
  • 结果:采用C数据类型的Python编程,实现混合编程

C语言官方:http://cython.org/

SWIG:一个将C/C++与脚本语言相整合的编译器,独立工具

  • 思路:通过一个编译器来实现Python和C的接口
  • 方式:纯C/C++编程,通过编写接口变成Python模块
  • 结果:独立C和Python编程,重点在于编写接口(描述)

SWIG官方:www.swig.org

ctypes:调用DLL或共享库的Python功能函数库,标准库API

  • 思路:通过一个Python标准库实现Python扩展
  • 方式:C语言功能编为.dll或.so库,加载库及调用函数,API
  • 结果:C语言独立编程,Python使用库调用接口函数

ctypes官方:https://docs/python/org/3.7/library/ctypes.html

CFFI:在Python中直接使用C函数的方式,第三方库

  • 思路:类似ctypes,使用API扩展C程序,也可以直接混合编程
  • 方式:关注C函数的访问接口,而不是库函数,构建API
  • 结果:C语言独立编程,Python用CFFI扩展,最小学习代价

CFFI官网:https://cffi.readthedocs.io/

小结:在Python程序中调用C/C++编写的库

  • Cython:采用C数据类型的Python编程
  • SWIG:将C转变为Python模块的接口编译工具
  • ctypes:调用.dll或.so的标准库API
  • CFFI:调用C函数及混合编程的第三方库API

3.Python的嵌入方法

Python嵌入:在C/C++程序中调用Python程序

  • 目的:利用Python高产、引入Python成熟功能库
  • 方式:Python/C API
  • 形式:C/C++ 为主程序,Python通过源文件形式使用

Python/C API:Python嵌入的主要接口

  • 嵌入Python语句:嵌入一个或多个Python语句
  • 嵌入Python脚本:嵌入一个或多个Python文件
  • Python/C API需要加载Python解释器及加载Python语句和脚本

Python/C API:Python嵌入的主要接口

  • Python/C API 是一组能够在C语言下执行的类型定义和函数
  • 头文件:Python.h
  • 函数:加载Python解释器、嵌入Python语句及脚本、数据类型转换等

加载Python解释器:

8b35c45f72b6c9dcd7a32a3fdf0c8016.png

4.Python的调用方法

Python调用:Python和C间以程序级别互相调用

  • 目的:模块间功能互用,以功能使用为目标
  • 方式:子进程或线程方式,即subprocess
  • 形式:C/C++和Python都是独立程序

在Python中调用C语言程序

  • 使用Python的subprocess模块
  • 步骤1:准备好C语言编写的待调用程序
  • 步骤2:使用subprocess模块调用并执行程序

subprocess模块

bda021bfacdaca60f431af3d798d1fa1.png


在C中调用Python程序

  • 使用C的system()函数
  • 步骤1:准备好Python编写的待调用程序
  • 步骤2:使用system()函数调用并执行程序

system()函数

e2b5f385ebca24af257b1094587cd3da.png

小结:Python和C间以程序级别互相调用

  • Python调用C :subprocess模块
  • C调用Python:system()函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C中调用Python类的方法有多种方式。一种常见的方法是使用pybind11库。pybind11是一个C++库,可以在C++和Python之间进行无缝转换。它提供了一种简单的方式来将C++类绑定到Python,并且可以在C++调用Python类的方法。通过使用pybind11,您可以在C++中创建一个Python模块,将C++类导出为Python类,并在C++调用Python类的方法。 另一种方法是使用Python的C API。您可以使用Python的C API在C中调用Python类的方法。首先,您需要使用PyImport_ImportModule函数导入Python模块,然后使用PyObject_GetAttrString函数获取Python类的引用。接下来,您可以使用PyObject_CallMethod函数调用Python类的方法。 这是一个使用Python的C API在C中调用Python类的示例代码: ```c++ #include <Python.h> int main() { // 初始化Python接口 Py_Initialize(); // 导入Python模块 PyObject* pModule = PyImport_ImportModule("module_name"); if (pModule == NULL) { // 模块导入失败 return 1; } // 获取Python类的引用 PyObject* pClass = PyObject_GetAttrString(pModule, "class_name"); if (pClass == NULL || !PyCallable_Check(pClass)) { // 类引用获取失败或者不可调用 return 1; } // 创建类的实例 PyObject* pInstance = PyObject_CallObject(pClass, NULL); if (pInstance == NULL) { // 类实例创建失败 return 1; } // 调用类的方法 PyObject_CallMethod(pInstance, "method_name", NULL); // 释放资源 Py_DECREF(pInstance); Py_DECREF(pClass); Py_DECREF(pModule); // 结束Python接口初始化 Py_Finalize(); return 0; } ``` 请注意,上述代码中的"module_name"是要导入的Python模块的名称,"class_name"是要调用的Python类的名称,"method_name"是要调用的Python类的方法的名称。您需要根据实际情况进行相应的更改。 总结起来,您可以使用pybind11库或Python的C API在C中调用Python类的方法。这些方法可以让您在C和Python之间进行无缝的交互,并实现代码的扩展和功能的增强。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值