一般思路

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函数

最新文章

  1. 修改jetty的默认端口号
  2. 移动端webapp自适应实践(css雪碧图制作小工具实践)图文并茂
  3. 前端编码风格规范之 JavaScript 规范
  4. 【转】70个经典的 Shell 脚本面试问题
  5. hadoop配置机架感知
  6. maven 搜索不到想从本地仓库依赖的jar包--重建本地maven仓库索引
  7. [转]C#调用FFMPEG,并异步读取输出信息的代码
  8. 在Android中将子View的坐标转换为父View的坐标
  9. MySQL学习笔记——复制的实现原理
  10. 解决iptables和vsftpd设置的问题
  11. centos 安装 redis3.2.0 集群
  12. [LeetCode] Array Nesting 数组嵌套
  13. 20 ViewPager demo5,6:FragmentAdapter 导航数据
  14. Android NDK开发method GetStringUTFChars’could not be resolved
  15. Matlab图像处理常用基本函数
  16. nodejs故障cnpm没反应
  17. LeetCode 728 Self Dividing Numbers 解题报告
  18. Firewalld防火墙:端口转发与流量均衡
  19. mysql指定编码集
  20. 几种序列化与get、set方法的关系

热门文章

  1. jquery 自定义右键菜单
  2. C# 常用方法——图片转base64字符串
  3. PyCharm控制台输出乱码
  4. JavaScript RegExp ——对象,语法,修饰符,方括号,元字符,量词,对象方法,对象属性
  5. echarts 图形图例文字太长如何解决
  6. python之timeit模块
  7. postman如何绕过登录账户和密码验证,进行接口测试的方法
  8. Linux-expect脚本-1
  9. 关于JavaScript的内存机制
  10. ZooKeeper java例子解读