千家信息网

python如何调用c语言代码

发表于:2025-02-21 作者:千家信息网编辑
千家信息网最后更新 2025年02月21日,这篇文章主要介绍"python如何调用c语言代码"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python如何调用c语言代码"文章能帮助大家解决问题。开发环境
千家信息网最后更新 2025年02月21日python如何调用c语言代码

这篇文章主要介绍"python如何调用c语言代码"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python如何调用c语言代码"文章能帮助大家解决问题。

开发环境

linux: python3.5.2 + ubuntu-gnome-16.04-desktop-amd64

windows:cygwin + powershell + python3.6

胶水语言python为什么要调用c代码?

c与python对比python不擅长"大量运算"任务,python程序优势在于:编写简单,适合"IO密集型作业"(比如打开文件,下载图片,运行脚本)。python作为知名的"胶水语言",快速实现"计算密集型作业"的方法就是"把c的代码拿过来直接用"。

Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改,也正是如此奠定了这种方法的简单性。

一、linux

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

#include  int add_int(int, int);float add_float(float, float); int add_int(int num1, int num2){    return num1 + num2;} float add_float(float num1, float num2){    return num1 + num2;}

2. 编译成so库

Ubuntu下执行:gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c

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

import ctypes #load the shared object fileadder = ctypes.cdll.LoadLibrary('./adder.so') #Find sum of integersres_int = adder.add_int(4,5)print("4 + 5 = " + str(res_int)) #Find sum of floatsa = ctypes.c_float(5.5)b = ctypes.c_float(4.1) add_float = adder.add_floatadd_float.restype = ctypes.c_float print("5.5 + 4.1 = " + str(add_float(a, b)))

4. 测试

执行:python3 python-c.py

结果如下:

4 + 5 = 9

5.5 + 4.1 = 9.600000381469727

5. 说明

在Python文件中,一开始先导入ctypes模块,然后使用cdll.LoadLibrary
函数来加载我们创建的库文件。这样我们就可以通过变量adder来使用C类库中的函数了。当adder.add_int()被调用时,内部将发起一个对C函数add_int的调用。ctypes接口允许我们在调用C函数时使用原生Python中默认的字符串型和整型。

而对于其他类似布尔型和浮点型这样的类型,必须要使用正确的ctype类型才可以。如向adder.add_float()函数传参时, 我们要先将Python中的十进制值转化为c_float类型,然后才能传送给C函数。这种方法虽然简单,清晰,但是却很受限。例如,并不能在C中对对象进行操作。

二、windows

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

同上

2. 编译成dll库

cygwin下执行:gcc -shared -Wl,-soname,adder -o adder.dll -fPIC add.c

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

import ctypes #load the shared object fileadder = ctypes.cdll.LoadLibrary('.\adder.dll') #Find sum of integersres_int = adder.add_int(4,5)print("4 + 5 = " + str(res_int)) #Find sum of floatsa = ctypes.c_float(5.5)b = ctypes.c_float(4.1) add_float = adder.add_floatadd_float.restype = ctypes.c_float print("5.5 + 4.1 = " + str(add_float(a, b)))

4. 测试

powershell下执行: .python-c.py

会出现以下错误:

OSError: [WinError 126]

原因:adder.dll本身依赖其它库,需要将这些库一起复制到当前目录。

cygwin下执行:ldd adder.dll

提示依赖以下库

将这些库copy到当前目录,执行:cp xxx.dll .

powershell下再次执行:.python-c.py

关于"python如何调用c语言代码"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

语言 代码 函数 方法 类型 准备 文件 模块 知识 程序 密集型 目录 胶水 行业 语言程序 作业 测试 编译 不同 知名 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 吴凡 网络安全保卫 网络安全渗透工作前景 网站用什么配置的云服务器 万方数据库教学与研究 网络安全技术的国内外意义 零基础软件开发学徒 软件开发及技术服务费 csgo选择服务器的界面不见了 网络安全问题属于社会治安问题吗 如何利用网络安全进行社会治理 没有服务器能用云主机吗 嘉兴网络技术工作室 宁畅服务器多少钱一台 如何创建数据库辅助类 饥荒 服务器 回档 求推荐网络技术培训前10名 黑色沙漠季节服务器时间 数据库事务理解图解 政法大学网络安全专业就业 网络安全伴我行装饰 传奇4国服怎么选择最新服务器 树结构持久化到数据库 山西手机软件开发多少钱 实时数据需要存数据库 泉州玖耀网络技术有限公司 软件开发结算书范本 数据库开发免费软件有哪些 数据库包含哪些内容 英国会议指责政府网络安全 锦尚互联网科技有限公司招聘
0