Python调用C语言动态链接库

调用方法

如果觉得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 ctypeslib = 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 ctypeslib = 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'

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#实现系统登录

1, 新建窗口frm_Loginusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace WindowsFormsA…

深度学习(FCN)

FCN是全卷积网络,用于做图像语义分割。通常将一般卷积网络最后的全连接层换成上采样或者反卷积网络,对图像的每个像素做分类,从而完成图像分割任务。 网络结构如下:这里并没有完全按照原始网络结构实现,而是尝试upsample和convTranspose2d结合的方式,看看有什么效果。 下…

多线程五-线程通信之wait与notify

wait与notify用于syncronized的线程间通信的一种,wait用来阻塞线程并释放锁,notify用来唤醒线程。他们与condition作用基本一致,但是由于syncronized为jdk实现,阅读源码有难度,所以通过了解其原理,用来帮助我们后续理解condition的源码。 可以通过下面一张图来理解:下面…

帝国cms忘记了后台密码怎么办

如果你忘记了帝国CMS(EmpireCMS)的后台管理员密码,可以通过以下步骤来重置密码: 方法 1: 通过数据库重置密码登录数据库:使用数据库管理工具(如phpMyAdmin)连接到你的数据库。 登录数据库管理界面。找到用户表:通常表名为 phome_enewsuser(具体表名可能有所不同)。 打…

如何恢复对帝国CMS的访问,忘记账号密码的解决方案

如果你忘记了帝国CMS的后台管理员账号和密码,可以通过以下步骤来恢复对系统的访问: 方法 1: 通过数据库重置密码登录数据库:使用数据库管理工具(如phpMyAdmin)连接到你的数据库。 登录数据库管理界面。找到用户表:通常表名为 phome_enewsuser(具体表名可能有所不同)。 …

编程日记 后端tags过滤器

编程日记 后端tags过滤器这样查出来了所有的信息,不对 检查是这个地方有问题改掉 @Overridepublic List<User> searchUsersByTags(List<String> tagNameList) {//1.先查询所有用户QueryWrapper<User> queryWrapper = new QueryWrapper<>();List<Us…

PbootCms忘记后台管理员密码这样找回

如果你忘记了PbootCMS后台管理员的密码,可以通过以下步骤来重置密码: 方法 1: 使用官方提供的密码重置工具下载密码重置工具:下载官方提供的密码重置工具 resetpw.php。 将 resetpw.php 文件上传到网站根目录。访问重置工具:在浏览器中访问 http://[您的域名]/resetpw.php。…

织梦CMS 忘记后台管理员密码的一种解决方法

如果你忘记了织梦CMS(Dedecms)的后台管理员密码,并且拥有对MySQL数据库的操作权限,可以按照以下步骤重置密码: 步骤 1: 登录 MySQL 数据库打开 MySQL 客户端,如 phpMyAdmin 或命令行工具。 登录 MySQL 数据库:sqlmysql -u 用户名 -p输入密码后登录。步骤 2: 选择对应的数…

编程日记 后端使用redis

编程日记 后端使用redis 问题:在写伙伴匹配系统的时候,要使用redis存储数据,需要在xml文件中设置spring.session.tore-type=redis 但是3.x版本的spring不再有这个参数。 那么怎么设置是否使用redis存储呢?只要导入了org.springframework.session包那就启用,不导入就不启用…

帝国cms网站忘记登陆账号密码怎么办

如果你忘记了帝国CMS的登录账号和密码,可以尝试以下方法来恢复访问权限:通过官方提供的找回功能:访问帝国CMS的登录页面。 查看是否有“忘记密码”链接。 点击此链接,并按照提示通过注册时绑定的邮箱或手机号来找回密码。手动重置数据库中的密码:使用数据库管理工具(如ph…

phpcmsV9 管理员密码丢失或忘记了怎么办

如果你在本地测试安装phpcmsV9时忘记了管理员密码,可以通过以下步骤手动重置密码: 方法/步骤打开数据库管理工具使用如phpMyAdmin这样的数据库管理工具连接到你的本地数据库。 通常,你可以通过访问 http://localhost/phpmyadmin/ 来打开phpMyAdmin。选择数据库和表选择你的p…

如何重置帝国CMS的忘记密码

重置帝国CMS的后台管理员密码可以通过以下方法实现: 方法一:使用官方提供的密码重置工具 如果帝国CMS官方提供了密码重置工具,可以使用该工具来重置密码:下载重置工具:从帝国CMS官方网站或其他可信来源下载官方提供的密码重置工具。 上传文件:将下载的重置工具文件上传到…