Linux环境下使用python调用C的printf例子:

  1. #!/usr/bin/env python2.7
  2. #-*- coding:utf-8 -*-
  3. from ctypes import *
  4. def test():
  5. #libc = cdll.LoadLibrary("libc.so.6")
  6. libc = CDLL("libc.so.6")
    msg = "hello world!\n"
  7. libc.printf("Testing:%s",msg)
  8. def main():
  9. test()
  10.  
  11. if __name__ == '__main__':
  12. main()

python中结构体对应的类型:

  1. #!/usr/bin/env python2.7
  2. #-*- coding:utf-8 -*-
  3. from ctypes import *
  4. class barley_amout(Structure):
  5. _fields_ = [
  6. ("barley_long",c_long),
  7. ("barley_int",c_int),
  8. ("barley_char",c_char*100)
  9. ]
  10. def main():
  11. bu = barley_amout(66,44,"Hello world")
  12. print bu.barley_long
  13. print bu.barley_int
  14. print bu.barley_char
  15.  
  16. if __name__ == '__main__':
  17. main()

python中Union体对应的类型:

  1. class _U(Union):
  2. _fields_ = [("lptdesc", POINTER(TYPEDESC)),
  3. ("lpadesc", POINTER(ARRAYDESC)),
  4. ("hreftype", HREFTYPE)]
  5.  
  6. class TYPEDESC(Structure):
  7. _anonymous_ = ("u",)
  8. _fields_ = [("u", _U),
  9. ("vt", VARTYPE)]

调用方式

  1. td = TYPEDESC()
  2. td.vt = VT_PTR
  3. td.lptdesc = POINTER(some_type)
  4. td.u.lptdesc = POINTER(some_type)

生成单个so动态库并通过python调用

1、test.c文件

  1. #include <stdio.h>
  2.  
  3. void print_helloworld(){
  4. printf("%s","Hello world!\n");
  5. }
  6.  
  7. int main(){
  8. print_helloworld();
  9. return ;
  10. }

2、生成动态库文件

  1. gcc -fPIC -c test.c -o libtest.o

通过这种方式在python调用的时候出现

OSError: ./libtest.o: only ET_DYN and ET_EXEC can be loaded

参照这个博客http://xieruilin.iteye.com/blog/730422

修改方式如下:

  1. gcc -fpic -shared -o libtest.o ./test.c

3、python调用

  1. [root@typhoeus79 20140509]# more call_test.py
  2. #!/usr/bin/env python2.7
  3. #-*- coding:utf-8 -*-
  4.  
  5. from ctypes import *
  6. def test():
  7. libc = CDLL("./libtest.o")
  8. libc.print_helloworld()
  9.  
  10. if __name__ == '__main__':
  11. test()
  12. [root@typhoeus79 20140509]# ./call_test.py
  13. Hello world!

 参考文献

https://docs.python.org/2/library/ctypes.html?highlight=structure#ctypes.Structure

https://docs.python.org/2.7/library/ctypes.html#module-ctypes

http://chimera.labs.oreilly.com/books/1230000000393/ch15.html#_solution_240

http://wangrqa.blog.163.com/blog/static/170946827201010309510247/

http://csl.name/C-functions-from-Python/

http://mypyg.iteye.com/blog/845915

python调用c代码的更多相关文章

  1. Python调用Java代码部署及初步使用

    Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...

  2. 如何实现Python调用C代码--python与C之间如何通信(swig)

    转载: https://www.zhihu.com/question/23003213 1. C代码如何调用Python 1.1 test #include <Python.h> int ...

  3. python 调用 java代码

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  4. python调用Go代码

    Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...

  5. 转python调用Go代码

    Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...

  6. python调用Java代码,完毕JBPM工作流application

    1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...

  7. python调用c代码2

    1.生成动态链接库 [root@typhoeus79 c]# more head.c #include <stdio.h> #include <stdlib.h> typede ...

  8. python调用java代码 java虚拟机(jvm)

    1.新建com文件夹,在里面新建 fibnq.java package com; public class fibnq { public fibnq(){} public int fb(int n){ ...

  9. python 调用js代码

    Python2   安装pyv8 pip install-egit://github.com/brokenseal/PyV8-OS-X#egg=pyv8 from pyv8 import PyV8 c ...

随机推荐

  1. HDU5661 Claris and XOR

    我们求二进制是怎么求的呢:先看看二进制的每一位代表多大:.......32 16 8 4 2 1 假如n=10, ..... 32>n ,不要. 16>n,不要. 8<=n,要,然后 ...

  2. 用C#实现字符串相似度算法(编辑距离算法 Levenshtein Distance)

    在搞验证码识别的时候需要比较字符代码的相似度用到"编辑距离算法",关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Dist ...

  3. Servlet实现后台分页查询

    相信大家在搭建后台的时候,经常会使用到分页功能,当然,目前有不少框架(如esayUI)都自带分页的实现,为了更好的理解分页原理,近期本人自己摸索了关于分页查询的一些心得. 归根结底,分页的核心还是在封 ...

  4. UVa225,Golygons

    刘儒家翻译的走出的图形可以自交,不知道大家是怎么理解的,反正我是认为这句话的意思是告诉我允许一个点访问多次 这样是WA的,n=15和n=16时多输出很多数据,应该是不允许自交,也就是不允许一个点访问多 ...

  5. Linux入门(7)——Ubuntu16.04安装wps并解决系统缺失字体问题

    进入WPS官网下载deb包: http://linux.wps.cn/ 安装,打开终端: cd 下载 ~a21_amd64.deb 解决打开WPS时出现的系统缺失字体问题: 下载 https://pa ...

  6. SPARK 学习笔记一

    1.Spark基于内存进行运算 2.Spark核心是SprintContext,是程序的入口 3.RDDs是提供抽象的数据集,通过RDDS可以方便对分布在各个节点的数据进行计算,而且忽略细节 4.RD ...

  7. LINUX 笔记-DU 和 DF

    du(disk usage)搜索文件统计文件大小 1.显示指定文件所占空间 du file1 file2 2.显示指定目录占的空间 du dir 3.只显示总和大小 du -s 4.以方便格式显示 d ...

  8. LeetCode 88. Merge Sorted Array(合并有序数组)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

  9. WPF获得全局窗体句柄,并响应全局键盘事件

    场景 wpf窗体运行后,只能捕获当前Active窗体的按键事件,如果要监听windows全局事件,并对当前窗口事件响应. 第一步:导入Winows API public class Win32 { [ ...

  10. ubuntu-17.10 安装 FANN

      因为想用C语言写神经网络,不用已有的库的话,又太难了,所以准备安装一个夸平台的FANN库, 源文件下载地址http://leenissen.dk/fann/wp/download/,我下载的是最新 ...