Python使用ctypes调用C/C++的方法


Posted in Python onJanuary 29, 2019

python使用ctypes调用C/C++

1. ctpes介绍

ctypes is a foreign function library for Python. It provides C compatible data types, and allows calling functions in DLLs or shared libraries. It can be used to wrap these libraries in pure Python.

官方文档地址: https://docs.python.org/3/library/ctypes.html

2.使用ctypes调用C语言

python对于标准C的兼容做的相当不错,调用起来相对比较简单,下面给大家上案例

1. 创建一个adder.c文件,代码如下:

#include <stdio.h>
  int add_int(int, int);
  float add_float(float, float);
  int add_int(int num1, int num2)
  {
    return num1 + num2;
  }
  float add_float(float num1, float num2)
  {
    return num1 + num2;
  }

这是一个标准C编写的连个函数,用来计算两个整数相加和两个单精度浮点数相加

2. 编译生成.so文件供python程序调用

在linux环境下使用gcc对adder.c进行编译

命令: gcc adder.c -fPIC -shared -o adder.so

3.在python程序中调用.so

创建一个python文件,命令为adder.py,代码如下:

from ctypes import *
adder = CDLL("./adder.so")
res_int = adder.add_int(4,5)
print("result: " + str(res_int))

然后在终端里执行命令: python adder.py

执行命令之后就能获得到输出了。

3. 使用ctypes调用C++

与调用C语言不通,在调用C++代码时,需要在源文件中增加一个extern "C"的代码块

1.创建一个adder_plus.cpp文件,代码如下:

#include <stdio.h>
#include <iostream>
using namespace std;
int add_integer(int a , int b);
float add_float(float a, float b);
int add_integer(int a , int b){
  return a + b;
}
float add_float(float a, float b){
  return a + b;
}
extern "C"{
  int add_integer_plus(int a , int b){
    return add_integer(a, b);
  }
  float add_float_plus(float a, float b){
    return add_float(a ,b);
  }
}

extern "C"里的代码是暴露给的python的接口,可以使用CDLL进行调用

2. 编译生成.so文件供python程序调用

在linux环境下使用gcc对adder.c进行编译

命令: gcc adder_plus.cpp -fPIC -shared -o adder_plus.so

3. 在python文件中调用.so

创建一个python文件,命名为adder_plus.py,代码如下:

from ctypes import *
add_plus = CDLL('./add_pluse.so')
sum = add_plus.add_integer_plus(4,5)
print("sum: " + str(sum))
# 使用float类型变量作为函数参数
a = c_float(5.5)
b = c_float(4.1)
add_float = add_plus.add_float_plus
add_float.restype = c_float
sum_float = add_plus.add_float_plus(a,b)
print(sum_float)

然后在终端里执行命令: python adder_plus.py

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python中操作MySQL入门实例
Feb 08 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
TensorFLow用Saver保存和恢复变量
Mar 10 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
python flask安装和命令详解
Apr 02 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
Pandas的read_csv函数参数分析详解
Jul 02 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
python json load json 数据后出现乱序的解决方案
Feb 27 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
dataframe 按条件替换某一列中的值方法
Jan 29 #Python
Numpy之random函数使用学习
Jan 29 #Python
pandas DataFrame 删除重复的行的实现方法
Jan 29 #Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 #Python
Python Pexpect库的简单使用方法
Jan 29 #Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 #Python
对python numpy.array插入一行或一列的方法详解
Jan 29 #Python
You might like
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
PHP基本语法实例总结
2016/09/09 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
Python Property属性的2种用法
2015/06/21 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
python列表使用实现名字管理系统
2019/01/30 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
python进度条显示之tqmd模块
2020/08/22 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
工程师岗位职责
2013/11/08 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers