首页 > 编程语言 >Python调用C语言动态链接库

Python调用C语言动态链接库

时间:2024-09-15 22:34:46浏览次数:6  
标签:lib Python float C语言 char int add ctypes 动态链接库

调用方法

如果觉得Python性能不够,可以使用C、C++或Rust、Golang为按标准C类型。为Python编写扩展。Python通过自带的ctypes模块,可以加载并调用C标准动态链接库(如.ddl 或 .so)中的函数。
常用的操作为:

import ctypes

# 加载动态链接库
lib = ctypes.CDLL("./xxx.so")

# 声明要调用函数的参数类型
lib.xxx.argtypes = [ctypes.xxx, ctypes.xxx, ...]

# 声明要调用函数的返回值类型
lib.xxx.restype = ctypes.xxx

例如,calc.so中有个c语言函数如下

int add_int(int a, int b) {
    return a + b;
}

则调用方法为

import ctypes

lib = ctypes.CDLL("./calc.so")
lib.add_int.argtypes=[ctypes.c_int, ctypes.c_int] # 都是c_int参数时可以省略
lib.add_int.restype = ctypes.c_int # 返回c_int时可以省略
print(lib.add_int(3, 5))

实践

  1. 使用C语言编写被调用函数
    calc.c
# include<stdio.h>

int add_int(int a, int b) {
    return a + b;
}

float add_float(float a, float b) {
    return a + b;
}

char * add_str(const char* a, const char* b, char *c) {
    sprintf(c, "%s%s", a, b);
    return c;
}
  1. 使用gcc编译为动态链接库

需要自行安装gcc

gcc -shared calc.c -o calc.so
  1. 使用Python调用C语言函数
    call_c.py
import ctypes


lib = ctypes.CDLL("./calc.so")
print(lib.add_int(3, 5))

lib.add_float.argtypes=[ctypes.c_float, ctypes.c_float]
lib.add_float.restype = ctypes.c_float
print(lib.add_float(3.2, 5.3))


lib.add_str.argtypes=[ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
lib.add_str.restype=ctypes.c_char_p
c = lib.add_str(b"Hello", b"World", b'')
print(c)

运行结果如下:

8
8.5
b'HelloWorld'

标签:lib,Python,float,C语言,char,int,add,ctypes,动态链接库
From: https://www.cnblogs.com/superhin/p/18415781/python_call_c

相关文章

  • python爬虫连载21
    XPath轴轴定义了当前节点和所选节点的树关系,绝对路径,以正斜杠开始(/),例如/step1/step2/……相对路径,不以正斜杠开始(/),例如step/step2/……步(step)的语法:轴(axis)::节点测试(node-test)[谓语]谓语是零个或者多个。 轴名称含义child选取当前节点的所有子元素parent选取当前节点的......
  • C语言:链表
    链表是一种常见的基础数据结构,它由一系列节点(Node)组成。每个节点包含两部分:数据域(存储数据)和指针域(存储下一个节点的地址)。链表的特点是元素在内存中不一定连续存储,而是通过指针连接起来。以下是链表的一些基本特点:动态性:链表的长度可以动态变化,不需要在创建时指定大小。灵活......
  • C语言:结构体
    一、结构体的概念和定义1.为什么要定义结构体结构体是由用户自己定义(设计)的数据类型。其实就是各种信息的打包。比如说,每个学生都有学号、姓名和成绩,100个学生就有100份这种数据,打包起来整合就会方便很多。2.结构体定义的格式struct[结构体名]{    成员列表}......
  • 【Python】基本使用
    目录变量的类型整数int浮点数float字符串str字符串长度格式化字符串布尔类型  动态类型注释 获取输入浮点数比较多元赋值for循环函数的定义和调用创建函数/定义函数调用函数/使用函数列表创建列表切片操作遍历列表新增元素判断元素是否在列表中......
  • 【Python】01.Python 介绍及其环境配置
    一、计算机的基础概念1.1什么是计算机所谓计算机,不光能进行算术运算,还能进行逻辑判断、数据存储、网络通信等等功能,以至于可以自动的完成非常复杂的工作。以下这些都可以称为“计算机”:1.2冯诺依曼体系结构而一台计算机通常由这几个部分组成:CPU存储器(内存,硬盘......
  • 使用python对交换机进行排障自动化运维
    importparamikoimportosimporttimeimportrandomimportdatetimeimportpandasaspdimportreimportnumpyasnp#fromsqlalchemyimporttext,create_engine#importpsycopg2#frompsycopg2importsql#fromsqlalchemy.ormimportsessionmaker#from......
  • C语言一些简单的细节记录
    一、声明和定义的区别1.声明(Declaration):是告诉编译器有一个变量、函数或类型存在,但不为其分配内存或提供具体的实现。声明提供了有关标识符(如变量名、函数名)的信息,包括类型和名称。它们通常在头文件中出现,以便在多个源文件中共享。例如,以下是变量、函数和类型的声明示例:......
  • python+flask计算机毕业设计社区医疗服务管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加快和人口老龄化的加剧,社区医疗服务在居民健康管理中扮演着越来越重要的角色。传统的社区医疗服务模式面临着信息孤岛、......
  • python+flask计算机毕业设计失物招领系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,人们频繁地穿梭于各种公共场所,如学校、商场、交通枢纽等,不可避免地会出现物品遗失或错拿的情况。传统的失物招领方式......
  • c语言写的环形队列
            以下是一个简单的环形队列的实现示例,包括初始化、入队、出队、查询当前元素个数、队列长度和队列元素可视化。        这里使用了静态数组来实现队列的存储,适合于固定大小的队列。#include<stdio.h>#defineMAX_QUEUE_SIZE10 //定义队列的最大......