【推荐】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
来源:oschina
链接:https://my.oschina.net/michaelshu/blog/3155278