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

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

python中结构体对应的类型:

#!/usr/bin/env python2.7
#-*- coding:utf-8 -*-
from ctypes import *
class barley_amout(Structure):
_fields_ = [
("barley_long",c_long),
("barley_int",c_int),
("barley_char",c_char*100)
]
def main():
bu = barley_amout(66,44,"Hello world")
print bu.barley_long
print bu.barley_int
print bu.barley_char if __name__ == '__main__':
main()

python中Union体对应的类型:

class _U(Union):
_fields_ = [("lptdesc", POINTER(TYPEDESC)),
("lpadesc", POINTER(ARRAYDESC)),
("hreftype", HREFTYPE)] class TYPEDESC(Structure):
_anonymous_ = ("u",)
_fields_ = [("u", _U),
("vt", VARTYPE)]

调用方式

td = TYPEDESC()
td.vt = VT_PTR
td.lptdesc = POINTER(some_type)
td.u.lptdesc = POINTER(some_type)

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

1、test.c文件

#include <stdio.h>

void print_helloworld(){
printf("%s","Hello world!\n");
} int main(){
print_helloworld();
return ;
}

2、生成动态库文件

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

修改方式如下:

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

3、python调用

[root@typhoeus79 20140509]# more call_test.py
#!/usr/bin/env python2.7
#-*- coding:utf-8 -*- from ctypes import *
def test():
libc = CDLL("./libtest.o")
libc.print_helloworld() if __name__ == '__main__':
test()
[root@typhoeus79 20140509]# ./call_test.py
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. zoj 1874 水题,输出格式大坑

    Primary Arithmetic Time Limit: 2 Seconds      Memory Limit: 65536 KB Children are taught to add mult ...

  2. Java面向对象 线程技术--上篇

     Java面向对象   线程 知识概要:                   (1)线程与进程 (2)自定义线程的语法结构 (3)多线程概念理解 (4)多线程状态图 (5)多线程--卖票 (6)同 ...

  3. Struts2 03---数据封装+获取表单提交数据

        Struts的数据封装分为三种:属性封装,模型驱动,表达式封装.下面以获取表单提交数据来简单介绍一下Struts的数据封装. <form action="loginlogin. ...

  4. This application failed to start because it could not find or load the Qt platform plugin "windows" 的问题原因以及解决方案

    1. 问题原因非常简单,经过各种百度,都没有找到解决方案,在此做一个记录备用. 2.原因就在于,项目目录使用了中文路径,然后出现了这个问题. 3.我是在使用 syncfusion 下的HTML 转PD ...

  5. popup方法

    popup方法: 一.创建一个页面 1.创建url和视图函数:: from django.shortcuts import render def p1(request): return render( ...

  6. C#实现局域网内远程开机

    1.远程开机原理 远程开机Wake on LAN(WOL),俗称远程唤醒,远程唤醒的实现主要是向目标主机发送特殊格式的数据包,是AMD公司制作的MagicPacket这套软件以生成网络唤醒所需要的特殊 ...

  7. 用node.js实现ORM的一种思路

    ORM是O和R的映射.O代表面向对象,R代表关系型数据库.二者有相似之处同时也各有特色.就是因为这种即是又非的情况,才需要做映射的. 理想情况是,根据关系型数据库(含业务需求)的特点来设计数据库.同时 ...

  8. Java Condition

    在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现, ...

  9. JS难点--面向对象(封装)

    我觉得js的难点之一就是面向对象编程. 面向对象 它是一种编程思想,它在写法上比面向过程相对来说复杂一些: 以下是我学习中关于面向对象的知识点总结:   1.什么是对象 从广义上说,"一切皆 ...

  10. IDEA + Maven + JavaWeb项目搭建

    前言:在网上一直没找到一个完整的IDEA+Maven+Web项目搭建,对于IDEA和Maven初学者来说,这个过程简单但是非常痛苦的,对中间的某些步骤不是很理解,导致操作错误,从而项目发布不成功,一直 ...