ctypes 封装c语言

一,python与C类型对应关系

最左边一列的ctypes type,以替代C库中的各种类型。

二,不带参数的调用

1,target.c

#include <stdio.h>

void hello_world(){
    printf("hello downey!!\r\n");
}

2,执行命令编译动态连接库文件

gcc -shared -o libtarget.dll target.c

        linux:
        gcc --shared -fPIC -o target.c libtarget.so
        windows:
        gcc -shared -o libtarget.dll target.c

3,test.py

import ctypes

if __name__ == '__main__':
    test = ctypes.windll.LoadLibrary("./libtarget.dll")
    test.hello_world()

4,输出

hello downey!!

三,带参数的调用

1,target.c

#include <stdio.h>

char add(int a, int b){
    return a + b;
}

char mul(int a, int b){
    return a * b;
} 

2,执行编译命令

    gcc -shared -o libtarget.dll target.c

3,test.py

from ctypes import *


if __name__ == '__main__':

    # windll.LoadLibrary("./libtarget.dll")  # woinows应该用windll ,但用cdll在windows下测测试也没问题。
    test = cdll.LoadLibrary("./libtarget.dll") # linux 用cdll

    test.add.restype = c_int
    test.mul.restype = c_int

    c = test.add(48,22)
    print(type(c))
    print(c)

    d = test.mul(48, 22)
    print(d)

4,输出

<class 'int'>
70
1056

四,结构体数据格式

1,target.c

#include <stdio.h>
#include <string.h>


typedef struct{
    char *ptr;
    float f;
    char array[10];
}target_struct;

target_struct* hello_world(target_struct* target){

    static char temp = 0x30;
    target->ptr = &temp;
    target->f = 3.1;
    memset(target->array,1,sizeof(target->array));
    return target;
}

2,执行编译命令

    gcc -shared -o libtarget.dll target.c

3,test.py

from ctypes import *

# 声明一个和结构体数据对应的数据结构类 
# _fields_是字典类型,key要与C库中结构体相对应,value则是指定相应类型
class test_struct(Structure):
    _fields_ = [('ptr', c_char_p),

                ('c', c_float),

                ('array', c_char * 10)]


if __name__ == '__main__':
    test = windll.LoadLibrary("./libtarget.dll")

    # 构造一个对应C中结构体的类,可以传入对应参数进行构造。
    struct = test_struct(c=0.5)

    #指定返回值类型为test_struct指针类型,这里的类型由POINTER()修饰,表示是指针类型
    test.hello_world.restype = POINTER(test_struct)

    # 调用hello_world()函数,传入struct类,pointer(struct)就是将struct转为指针类型实例。因为在C中的接口就是传入target_struct类型,返回target_struct类型,所以ret_struct也是target_struct*类型
    ret_struct = test.hello_world(pointer(struct))

    # 打印函数返回值,查看执行结果。对于一个指针类型的变量,如果我们要获取它的值,可以使用.contents方法
    print(ret_struct.contents.ptr)
    print(ret_struct.contents.c)

4,输出

b'0'
3.0999999046325684
 

五,参数传入函数引用,c调用python函数

1,target.c

#include <stdio.h>
#include <string.h>


typedef void (*callback)(int);

void func(callback c1,callback c2,int p1,int p2){

    c1(p1);
    c2(p2);
}

2,执行编译命令

 gcc -shared -o libtarget.dll target.c

3,test.py

from ctypes import *


def test_callback1(val):
    print("I'm callback1")
    print(val)


def test_callback2(val):
    print("I'm callback2")
    print(val)


if __name__ == '__main__':
    test = windll.LoadLibrary("./libtarget.dll")

    CMPFUNC = CFUNCTYPE(None, c_int)

    cbk1 = CMPFUNC(test_callback1)

    cbk2 = CMPFUNC(test_callback2)

    test.func(cbk1, cbk2, 1, 2)

4,输出

I'm callback1
1
I'm callback2
2

windos 安装gcc:

Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly_mingw the file has been downloaded incorrectly-CSDN博客

参考:

python代码用c语言封装_python调用C语言接口-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java,SSM,html,Vue在线视频播放管理系统网站设计

摘要 基于Java, SSM, HTML, Vue的在线视频播放管理系统网站设计是一个利用Spring框架、SpringMVC、MyBatis&#xff08;SSM&#xff09;和前端技术HTML与Vue.js实现的多功能Web应用。这个系统旨在为用户提供一个便捷、高效的平台来上传、管理和观看视频内容&#xff0c;同时兼…

吴恩达2022机器学习专项课程(一) 5.1 多元特征回归

问题预览/关键词 多元特征回归是什么&#xff1f;多元特征回归的符号多元特征回归的函数是&#xff1f;函数简化版 笔记 1.多元特征回归 从单一的输入特征&#xff08;如房子的大小&#xff09;扩展到多个输入特征&#xff08;如卧室数量、楼层、房龄&#xff09;。 2.多元…

Android java基础_类的继承_android 类继承(2)

运行结果&#xff1a;rootubuntu:/home/topeet/guyilian# javac Ext2.java rootubuntu:/home/topeet/guyilian# java Ext2 10 ustc **子类继承父类的方法和属性都可以进行覆写&#xff0c;我们在子类覆写父类的printInfo方法。**class Person { private int age; public void …

图像拼接——最小割准则提取拼接缝

一、最大流问题与Ford-Fulkerson算法介绍 二、最大流与最小割 显然,我们有对任意一个割,穿过该割的净流量上界就是该割的容量,即不可能超过割的容量。所以网络的最大流必然无法超过网络的最小割。最小割是指割的容量最小,最大流是指网络当中最大的净流量,简单的例子s是水龙…

深入浅出 -- 系统架构之微服务架构选型参考图

技术选型架构图 是一个用于展示项目中所采用的各种技术和组件之间关系的图表。 它通常包括以下几个部分&#xff1a; 1. 项目名称和描述&#xff1a;简要介绍项目的背景和目标。 2. 技术栈&#xff1a;列出项目中使用的主要技术和工具&#xff0c;如编程语言、框架、数据库…

47.函数基本概念和用法

目录 一.什么是函数 二.定义函数 三.函数调用 四.函数的声明 五.函数的分类 六.视频教程 一.什么是函数 每个C语言程序至少有一个函数&#xff0c;即主函数man函数。除了主函数以外&#xff0c;我们也可以自定义其他函数。 函数可以看作是某个功能的封装&#xff0c;而且…

[AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试

目录 关键词平台说明背景一、需求二、配置2.1 NvMBlockDescriptors2.2 NvMFeeRef2.3 FeeBlockConfigurations 三、code3.1 声明和定义3.2 调试 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编…

useBlocker 防止页面跳转导致的表单丢失

关于useBlocker The hook allows you to prevent the user from navigating away from the current location, and present them with a custom UI to allow them to confirm the navigation 在react-router的v6版本之前&#xff0c;我们会使用<Prompt />组件来拦截路由的…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。…

【C++ STL排序容器】set 集合

文章目录 【 1. 基本原理 】【 2. set 的定义 】2.1 调用默认构造函数&#xff0c;创建空的 set 容器2.2 在创建 set 容器的同时&#xff0c;对其进行初始化2.3 拷贝构造的方式创建2.4 取已有 set 容器中的部分元素&#xff0c;来初始化新 set 容器2.5 修改排序规则的方式创建 …

1.Spring Boot框架整合

Spring Boot项目创建&#xff08;约定大于配置&#xff09; 2.1.3.RELEASE版本示例 idea创建 从官网下载&#xff08;https://start.spring.io/&#xff09;单元测试默认依赖不对时&#xff0c;直接删除即可 Web支持&#xff08;SpringMVC&#xff09; <dependency>&…

Linux操作系统之防火墙

目录 一、防火墙 1、防火墙的类别 2、安装iptables(四表五链&#xff09; ​​​​​​​一、防火墙 1、防火墙的类别 安全产品 杀毒 针对病毒&#xff0c;特征篡改系统中文件杀毒软件针对处理病毒程序 防火墙 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 防火墙…

基于springboot实现美容院管理系统项目【项目源码+论文说明】

基于springboot实现美容院管理系统演示 摘要 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;因此传统管理方式就不适合。为了让美容院信息的管理模式进行升级&#xff0c;也为了更好的维护美容院信息&#xff0c;美容院管理系统的…

关于第十二届蓝桥杯时间显示题中包和模块的使用解释

题目信息&#xff1a; 解题代码&#xff1a; from datetime import datetime, timedelta # 定义起始时间&#xff0c;即 Unix 时间戳的零点&#xff08;1970年1月1日&#xff09; start datetime(year1970, month1, day1) # 定义时间间隔&#xff0c;这里以毫秒为单位 dela …

用3点结构数列构造4点结构数列

在一个行和列可以自由变换的平面上&#xff0c;3个点只有6种相对位置关系 现在有一个3点的数列就按照1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6的顺序排列&#xff0c;让这个数列按照431&#xff0c;34-1的方式递推&#xff0c;直到稳定。 前4次迭…

混合专家(MoE)模型示例

文心一言 混合专家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;模型是一种机器学习架构&#xff0c;它结合了多个专家模型&#xff08;或子模型&#xff09;以处理不同的输入数据或任务。每个专家模型在其特定领域内表现出色&#xff0c;而MoE模型则负责根据输…

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

.locked勒索病毒的最新威胁:如何恢复您的数据?

导言&#xff1a; 在当今日益数字化的世界中&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒便是一个不容忽视的威胁。近年来&#xff0c;.locked勒索病毒逐渐崭露头角&#xff0c;其恶意行为给广大用户带来了极大的困扰。本文91数据恢复将简要介绍.locked勒索病毒…

DWARF简析

sevaa/dwex: DWARF Explorer - a GUI utility for navigating the DWARF debug information (github.com)eliben/pyelftools: Parsing ELF and DWARF in Python (github.com)8 调试信息标准: DWARF GitBook (hitzhangjie.pro) 1.需求 通过elf获取到原文件中的相关数据定义&am…

LeetCode-热题100:2. 两数相加

题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都…