Python通过C动态链接库调用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 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))
实践#
- 使用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;
}
- 使用gcc编译为动态链接库
需要自行安装gcc
gcc -shared calc.c -o calc.so
- 使用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'
作者:韩志超
出处:https://www.cnblogs.com/superhin/p/18415781/python_call_c
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如有问题,请微信联系 superz-han,并发送原文链接。
合集:
Python跨语言调用
/* 请我喝杯咖啡吧 */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2021-09-15 Python使用zipfile模块压缩和解压缩文件及目录