...

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))

实践#

  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'

作者:韩志超

出处:https://www.cnblogs.com/superhin/p/18415781/python_call_c

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

如有问题,请微信联系 superz-han,并发送原文链接。

posted @   韩志超  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-09-15 Python使用zipfile模块压缩和解压缩文件及目录
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu