Python3如何调用c语言动态库

随声附和 提交于 2020-01-09 14:26:42

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

c语言与python相比,Python不擅长大量复杂的计算或者高并发的任务,python程序优势在于:编写简单,适合做业务相关的任务。Python作为知名的"胶水语言",通过调用C语言的动态库来实现大量复杂的计算或者高并发"的任务,以达到快速开发和程序效率兼顾的目的。
Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载动态库文件,因此在调用时不需对源文件C语言的动态库文件做任何的修改,也正是如此非常简单,不失为今后的开发的选择。

1. 准备C语言程序,保存为add.c

#include <stdio.h> 

int add_int(int num1, int num2)
{    
    return num1 + num2;

float add_float(float num1, float num2)

    return num1 + num2;
}


2. 编译成so库

gcc -shared -O3 -o add.so -fPIC add.c

3. 准备python代码,保存为python-c.py

# -*- coding: utf-8 -*-
from ctypes import *

#引入动态库libDemo.so
library = cdll.LoadLibrary("./add.so")
#library = cdll.LoadLibrary("/root/pytest/add.so")

library.add_float.argtypes = [c_float]

a = c_float(30.2)
b = c_float(40.3)
library.add_float.restype = c_float

library.add_int(3, 4)
print("3 + 4 = " + str(library.add_int(3,4)))

print("a = " + str(a))
print("30.2 + 40.3 = " + str(library.add_float(a, b)))

注意:cdll.LoadLibrary("./add.so") 必须是./ 或者绝对路径,python调用c语言动态库的函数,有参数的话,需要在argtypes中设置参数的类型,在restype设置函数的返回类型。

ctypes 和 c语言的类型转换参考:

https://docs.python.org/zh-cn/3.7/library/ctypes.html#module-ctypes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!