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 strip lstrip rstrip使用方法
Sep 06 Python
python实现问号表达式(?)的方法
Nov 27 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
python简单贪吃蛇开发
Jan 28 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
python实现TCP文件传输
Mar 20 Python
Python安装Bs4的多种方法
Nov 28 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 Python
5道关于python基础 while循环练习题
Nov 27 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
TopList标签和JavaScript结合两例
2007/08/12 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
js实现烟花特效
2020/03/02 Javascript
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
python银行系统实现源码
2019/10/25 Python
python、Matlab求定积分的实现
2019/11/20 Python
python global和nonlocal用法解析
2020/02/03 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
python如何支持并发方法详解
2020/07/25 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
物理系毕业生自荐信
2013/11/01 职场文书
团组织关系介绍信
2014/01/12 职场文书
商业房地产广告语
2014/03/13 职场文书
关于诚信的活动方案
2014/08/18 职场文书
校园运动会广播稿
2014/10/06 职场文书
Python pyecharts绘制条形图详解
2022/04/02 Python
Docker下安装Oracle19c
2022/04/13 Servers
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers
Java中的Kotlin 内部类原理
2022/06/16 Java/Android