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. java web mysql 入门知识讲解

     MySQL学习笔记总结 一.SQL概述: SQL:Structured Query Language的缩写(结构化查询语言) SQL工业标准:由ANSI(ISO核心成员) 按照工业标准编写的SQ ...

  2. FirstIDL

    pro FIRSTIDL ;控制台输出 print,'first IDL' ;控制台输出 void=dialog_message('Hello,IDL world!',/information) en ...

  3. #云栖大会# 移动安全专场——APP渠道推广作弊攻防那些事儿(演讲速记)

    导语: 如今,移动互联网浪潮进入白热化竞争态势,APP渠道传播成为很多企业常用的推广方式,APP推广费用也在水涨船高,从PC时代的一个装机0.5元到1元不等,到移动互联网时代的5元,甚至几十元,但为什 ...

  4. 根据Dockerfile创建docker dotnet coer 镜像

    那我们先来看看Dockerfile文件内容,注意这个文件是没后缀名的. #依赖原始的镜像,因为我们是要创建dotnet coer镜像,所以我就用了官方给的镜像[microsoft/dotnet:lat ...

  5. 接口自动化测试方案PHP + mysql

    接口测试在测试工作中是很常见的工作,但是在以往的接口测试工作中借助的一般是第三方插件.python开发的发送请求脚本.LR脚本.Jmeter脚本,之前也使用python开发了一套接口自动化测试系统,但 ...

  6. win10 uwp 验证输入 自定义用户控件

    TextBox是给用户输入,我们有时要用户只输入数字,而用户输入汉字,我们就有提示用户,那么这东西用到次数很多,我们需要做成一个控件. 我们可以用别人的库,我找到一个大神写的库,很好用 我们使用这个库 ...

  7. ubuntu tftp-server 服务器安装与配置

    第一步:安装tftp服务sudo apt-get install tftpd tftp openbsd-inetd第二步:目录配置vi /etc/inetd.conf修改文件夹为根目录下的tftpbo ...

  8. stringstream缓存正确清除方法

    当需要清空stringsteam缓存的时候,到底是.str("")呢还是.clear(); 实际上,我认为,保守起见,两者都需要 clear() 是清除 state flag st ...

  9. Log4j各级别日志重复打印的问题

    今天在配置Log4j日志的时候,发现日志重复打印的问题.网上查了很多资料,发现介绍Log4j配置的文章数量不少,但提到这个问题的文章却寥寥,解决了自己的问题以后,赶紧记录一下. 原文地址:http:/ ...

  10. 修改Oracle【12C】字符集

    select userenv('language') from dual; //查看系统字符集编码 select * from nls_database_parameters where parame ...