Python使用ctypes调用C/C++的方法
作者:JimmyU1 发布时间:2023-09-01 21:27:47
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
来源:https://blog.csdn.net/u012449363/article/details/75452374


猜你喜欢
- scrollHeight: 获取对象的滚动高度。 scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的
- 目录写在前面双向加密ENCODE/DECODEAES_ENCRYPT/AES_DECRYPTDES_ENCRYPT/DES_DECRYPT单
- python 根据正则表达式提取指定的内容正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事。 下面演
- ALTER TABLE允许你修改一个现有表的结构。例如,你可以增加或删除列、创造或消去索引、改变现有列的类型、或重新命名列或表本身。你也能改
- mysql优化是我们日常工作经常遇到的问题,今天给大家说下MySQL常见的几种优化方案。注:原始资料来自享学课堂,自己加上整理和思考思考sq
- 一、 技术要点 我们都知道Windows应用程序在运行时会启动一个进程,其总包括若干线程,不同的进程之间通信是开发分布
- 阅读本文能够帮助你什么?在学习vue源码的时候发现组件化过程很绕?在响应式过程中Observer、Dep、Watcher三大对象傻傻分不清?
- 基于 Snapchat 的增强现实胡子挂件融合第一个项目中,我们将在检测到的脸上覆盖了一个小胡子。我们可以使用从摄像头捕获的连续视频帧,也可
- 相比于range,list等简易单词,enumerate仅凭外形都不太让人愿意用。事实上,enumerate还是很好用的。enumerate
- 本文实现文件分类器的目的主要是为了将办公过程中产生的各种格式的文件完成整理。通过自定义需要整理的文件目录,将该目录下面的全部文件按照文件格式
- 一、介绍数据库的约束是对表中数据进行的一种限制,为了保证数据的正确性、有效性、完整性。无论是在添加数据还是在删除数据的时候,都能提供帮助。所
- 首先,大家先去下载一份dvbbs.php beta1的代码,解压后先抛开php代码,找出你的mysql手册,如果没有手册那么就直接看下面的实
- 在用wordpress这个博客的时候,我很奇怪的发现,最近写的内容排在第一页,而最早写的成了最后页。这显然有悖逻辑,正常的情况应该是最早写的
- 在sql语句中,我们难免会用到单引号嵌套的时候,但是直接嵌套肯定是不行的,java中用反斜杠做转义符也是不行的,在sql中是用单引号来做转义
- 1.intersect为取多个查询结果的交集;2.查询两个基本时间段内表记录的SQL语句;select * from shengjibiao
- 这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还是太过于简单了,如果要
- 早期写的python障碍式期权的定价脚本,供大家参考,具体内容如下#coding:utf-8'''障碍期权q=x/s
- 一、枚举与字典类型字典类型的缺点:1.值可变 2.没有防止相同标签的功能枚举的特点:1.枚举类的值不可以被外界更改 2.不能存在相同的标签,
- 一、开发时管理数据库遇到的问题:现在开发一般都是团队开发,这样就会出现项目同步的问题,代码同步可以通过SVN工具管理起来,那数据库同步怎么办
- 昨天写了一段用来做分层随机抽样的代码,很粗糙,不过用公司的2万名导购名单试了一下,结果感人,我觉得此刻的我已经要上天了,哈哈哈哈哈哈代码如下