在Linux上实现Python调用C语言函数
2024-10-19 13:18:58
一般思路
Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用。
假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y).
将.c文件编译成 .so文件
gcc -fPIC -shared test.c -o test.so
运行后会看到有test.so文件生成。
在Python中导入C文件
在当前目录下打开Python
import os
from ctypes import *
p = os.getcwd() + '/test.so’ #表示.so文件的绝对路径,如果你没在当前路径打开python则可能需要修改
f = CDLL(p) #读取.so文件并赋给变量f
这时如果没报错,就说明导入该.so文件成功了,可以调用脚本中的函数。
调用函数
# 变量为整数
a = 3
b = 4
f.func(a, b) #该步即运行函数func(x,y)
# 变量为浮点数
c = c_float(5.5)
d = c_float(6.66)
f.func(c, d)
以上便为调用C中函数的简单形式。
复杂情况
有时,在我们需要的C脚本中,调用了其他的库,或者也同时调用了以 .h形式被调用的同级别的C脚本。这种情况需要以下步骤:
将所有.c文件编译为 .o文件
该步骤就按你的需求去编译生成,但记得加入 -fPIC, 编译后生成一个或多个.o文件。如果你的C脚本只有一个(即并未调用其他同级别C脚本),当然只有1个.o文件。几个C脚本生成几个.o文件。
将所有.o文件编译为.so文件
gcc -shared -o main.so *.o *-lfftw3 *
上述命令将所有的.o文件编译为main.so文件,最后的-lfftw3表示C脚本中调用的其他库,我的是fftw3库,你需要加你自己调用的库名字。运行后可生成main.so文件
可用 ldd -r main.so查看.so文件,如果未出现undefined symbol,则编译应该是正确的。
运行脚本
如果你需要运行脚本而不是只用某个函数,可直接运行该脚本的 main函数
import os
from ctypes import *
p = os.getcwd() + '/test.so’
f = CDLL(p)
f.main() #运行C脚本中的main函数
最新文章
- 修改jetty的默认端口号
- 移动端webapp自适应实践(css雪碧图制作小工具实践)图文并茂
- 前端编码风格规范之 JavaScript 规范
- 【转】70个经典的 Shell 脚本面试问题
- hadoop配置机架感知
- maven 搜索不到想从本地仓库依赖的jar包--重建本地maven仓库索引
- [转]C#调用FFMPEG,并异步读取输出信息的代码
- 在Android中将子View的坐标转换为父View的坐标
- MySQL学习笔记——复制的实现原理
- 解决iptables和vsftpd设置的问题
- centos 安装 redis3.2.0 集群
- [LeetCode] Array Nesting 数组嵌套
- 20 ViewPager demo5,6:FragmentAdapter 导航数据
- Android NDK开发method GetStringUTFChars’could not be resolved
- Matlab图像处理常用基本函数
- nodejs故障cnpm没反应
- LeetCode 728 Self Dividing Numbers 解题报告
- Firewalld防火墙:端口转发与流量均衡
- mysql指定编码集
- 几种序列化与get、set方法的关系