python调用c语言函数 | 酷壳

酷壳  •  扫码分享
我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  
e&&s.heightt&&s.width=w&&t<=b+w}function s(){var e=document.createelement("audio");e.setattribute("class",l);e.src=i;e.loop=false;e.addeventlistener("canplay",function(){settimeout(function(){x(k)},500);settimeout(function(){n();p();for(var e=0;eif you are reading this, it is because your browser does not support the audio element. we recommend that you get a new browser.

";document.body.appendchild(e);e.play()}function x(e){e.classname+=" "+s+" "+o}function t(e){e.classname+=" "+s+" "+u[math.floor(math.random()*u.length)]}function n(){var e=document.getelementsbyclassname(s);var t=new regexp("\\b"+s+"\\b");for(var n=0;nhigh一下!

酷壳 – coolshell.cn

享受编程和技术所带来的快乐 – http://coolshell.cn
  • 首页
  • 推荐文章
  • 本站插件
  • 留言小本
  • 关于酷壳
  • 关于陈皓
首页 > python, 编程语言 > python调用c语言函数

python调用c语言函数

2009年4月26日 陈皓 发表评论 阅读评论 8,962 人阅读 & &

使用python的ctypes,我们可以直接调用由c直接编译出来的函数。其实就是调用动态链接库中的函数。为什么我们需要这样做呢,因为有些时候,我们可能需要一个性能上比较讲究的算法,有些时候,我们可以在python中使用已经有了的现成的被封闭在动态链接库中的函数。下面是如何调用的示例。

首先,我们用一个乘法来表示一个算法功能。下面是c的程序:

int
multiply(int num1, int num2)
{
    return num1 * num2;
}

如果在windows下,你可能需要写成下面这个样子:

#include <windows.h>


bool apientry
dllmain(handle hmodule, dword dwreason, lpvoid lpreserved)
{
    return true;
}

__declspec(dllexport) int
multiply(int num1, int num2)
{
    return num1 * num2;
}

然后,自然是把这个c文件编成动态链接库:

linux下的编译:

gcc -c -fpic libtest.c
gcc -shared libtest.o -o libtest.so

windows下的编译:

cl -ld libtest.c -libtest.dll

于是在我们的python中可以这样使用:
(其中的libtest.so在windows下改成libtest.dll即可)

>>> from ctypes import *
>>> import os
>>> libtest = cdll.loadlibrary(os.getcwd() + '/libtest.so')
>>> print libtest.multiply(2, 2)
4

注意:上面的python脚本中需要把动态链接库放到当前目录中。

(转载本站文章请注明作者和出处 酷壳 – coolshell.cn ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 以支持公益事业 ===——
分类: python, 编程语言 标签: ctypes, python
好烂啊有点差凑合看看还不错很精彩 (13 人打了分,平均分: 5.00 )
loading ...&loading ...

相关文章

  • 2012年07月13日 -- 代码执行的效率
  • 2009年09月27日 -- 非常简单的python http服务
  • 2009年12月11日 -- 如何使用python操作摄像头
  • 2009年04月26日 -- 用python写ncurses ui
  • 2009年04月12日 -- python处理中文的时候的一些小技巧
  • 2009年05月10日 -- 用tcc可以干些什么?
  • 2009年04月30日 -- 某python实现的尾部递归
  • 2010年02月01日 -- python程序员的进化
zemanta
评论 (9) trackbacks (1) 发表评论 trackback
  1. xavier
    2010年1月30日11:07 | #1
    回复 | 引用

    总结地不错,学习了。
    我手上有个小项目(开源那种),需要帮助,能与我联系否?

  2. lalala
    2010年8月11日09:15 | #2
    回复 | 引用

    试了一下,这的可以,呵呵

  3. 技术的吸收者
    2010年11月16日14:47 | #3
    回复 | 引用

    一个python 初学者。 谢谢,很喜欢你的翻译!

  4. zhangroc
    2010年12月16日00:32 | #4
    回复 | 引用

    python 调用c语言库: 其实就是要定义号数据交换的接口,和动态链接库的加载和函数名符号解析

  5. superiori46
    2011年11月3日13:57 | #5
    回复 | 引用

    不过对于c函数中的传入参数的结构体的问题是怎么解决的?在python中是如何和c函数中的传入参数对应上的?

  6. 楚公子
    2011年12月19日22:20 | #6
    回复 | 引用

    @xavier
    嗯嗯,好呀。。里留下你的联系方式吧。。我对你的项目很感兴趣

  7. 匿名的网友
    2012年8月21日16:14 | #7
    回复 | 引用

    superiori46 :
    不过对于c函数中的传入参数的结构体的问题是怎么解决的?在python中是如何和c函数中的传入参数对应上的?

    用ctypes可以构建c中的结构,比如struct用ctypes可以这样构建:
    class mystr(structure):
    _fields_ = [
    ("amt_barley", c_int),
    ("amt_water", c_int),
    ]

  8. styshoo
    2012年9月17日10:34 | #8
    回复 | 引用

    简介,清晰,很好。

  9. rex
    2013年5月28日08:59 | #9
    回复 | 引用

    请问如果我的共享库依赖于一个其他第三方共享库,在用ctypes的时候仅加载前者会导致符号未解析,这时候应该怎么办呢?ctypes能搞定吗?

  1. 2011年8月5日20:46 | #1
    runaway robot (3) – python – web – 思路片段 – 计算机 – c – computer – hack – programming – python – 妖精的尾巴
订阅评论

用python写ncurses ui 使用php的curl库
订阅
  • google
  • 有道
  • 鲜果
  • 抓虾
  • my yahoo!
  • newsgator
  • bloglines
  • 哪吒
  • qq mail
  • douban
  • rojo
  • pageflakes
twitter

本站公告

访问 酷壳404页面 支持公益!

酷壳建议大家多使用rss访问阅读(本站已经是全文输出,推荐使用google reader)。有相关事宜欢迎电邮:haoel(at)hotmail.com。最后,感谢大家对酷壳的支持和体谅!

感谢 42qu.com 为本站提供 vps

最新文章

  • 浏览器的渲染原理简介
  • 疫苗:java hashmap的死循环
  • “c++的数组不支持多态”?
  • unix考古记:一个“遗失”的shell
  • pfif网上寻人协议
  • “作环保的程序员,从不用百度开始”
  • 《rework》摘录及感想
  • 实例分析java class的文件结构
  • 并发框架disruptor译文
  • sed 简明教程
  • awk 简明教程
  • linus:利用二级指针删除单向链表
  • 从面向对象的设计模式看软件设计
  • 应该知道的linux技巧
  • 程序算法与人生选择
  • web工程师的工具箱
  • 如此理解面向对象编程
  • 程序员疫苗:代码注入
  • 你可能不知道的shell
  • 为什么不能用微信或米聊这类的软件
  • 如何测试洗牌程序
  • go 语言简介(下)— 特性
  • go 语言简介(上)— 语法
  • tf-idf模型的概率解释
  • xkcd 神图“click and drag”
  • bret victor – learnable programming
  • c/c++语言中闭包的探究及比较
  • 对九个超级程序员的采访
  • 无锁队列的实现
  • “单元测试要做多细?”

全站热门

  • 程序员技术练级攻略
  • 简明 vim 练级攻略
  • 如何学好c语言
  • 6个变态的c语言hello world程序
  • 由12306.cn谈谈网站性能技术
  • android将允许纯c/c++开发应用
  • 我是怎么招聘程序员的
  • “21天教你学会c++”
  • 应该知道的linux技巧
  • 做个环保主义的程序员
  • 28个unix/linux的命令行神器
  • 编程真难啊
  • “作环保的程序员,从不用百度开始”
  • web开发中需要了解的东西
  • stevey对amazon和google平台的吐槽
  • c++ 程序员自信心曲线图
  • 20本最好的linux免费书籍
  • 如何写出无法维护的代码
  • 各种流行的编程风格
  • 深入理解c语言
  • 程序算法与人生选择
  • windows编程革命简史
  • 面试题:火车运煤问题
  • 如何学好c++语言
  • 三个事和三个问题
  • 别的程序员是怎么读你的简历的
  • 老手是这样教新手编程的
  • 偷了世界的程序员
  • c语言的谜题
  • 再谈“我是怎么招聘程序员的”(上)

新浪微博

标签

agile ajax algorithm android bash c++ coding css database design design pattern ebook flash game go google html ie java javascript jquery linux mysql oop password performance php programmer programming language puzzle python ruby sql tdd ui unix vim web windows xml 口令 安全 程序员 算法 面试

分类目录

  • .net编程 (2)
  • ajax开发 (9)
  • c/c++语言 (50)
  • erlang (1)
  • java语言 (28)
  • php脚本 (11)
  • python (20)
  • ruby (4)
  • unix/linux (63)
  • web开发 (98)
  • windows (12)
  • 业界新闻 (25)
  • 企业应用 (2)
  • 技术新闻 (32)
  • 技术管理 (7)
  • 技术读物 (115)
  • 操作系统 (43)
  • 数据库 (10)
  • 杂项资源 (246)
  • 流程方法 (43)
  • 程序设计 (65)
  • 系统架构 (5)
  • 编程工具 (61)
  • 编程语言 (157)
  • 网络安全 (21)
  • 职场生涯 (32)
  • 趣味问题 (13)
  • 轶事趣闻 (145)

归档

  • 2013 年五月&(2)
  • 2013 年四月&(3)
  • 2013 年三月&(3)
  • 2013 年二月&(5)
  • 2013 年一月&(1)
  • 2012 年十二月&(4)
  • 2012 年十一月&(5)
  • 2012 年十月&(3)
  • 2012 年九月&(4)
  • 2012 年八月&(8)
  • 2012 年七月&(4)
  • 2012 年六月&(7)
  • 2012 年五月&(6)
  • 2012 年四月&(6)
  • 2012 年三月&(6)
  • 2012 年二月&(3)
  • 2012 年一月&(6)
  • 2011 年十二月&(5)
  • 2011 年十一月&(9)
  • 2011 年十月&(6)
  • 2011 年九月&(5)
  • 2011 年八月&(14)
  • 2011 年七月&(6)
  • 2011 年六月&(12)
  • 2011 年五月&(5)
  • 2011 年四月&(18)
  • 2011 年三月&(16)
  • 2011 年二月&(16)
  • 2011 年一月&(18)
  • 2010 年十二月&(11)
  • 2010 年十一月&(11)
  • 2010 年十月&(19)
  • 2010 年九月&(15)
  • 2010 年八月&(10)
  • 2010 年七月&(20)
  • 2010 年六月&(9)
  • 2010 年五月&(13)
  • 2010 年四月&(12)
  • 2010 年三月&(11)
  • 2010 年二月&(7)
  • 2010 年一月&(9)
  • 2009 年十二月&(22)
  • 2009 年十一月&(27)
  • 2009 年十月&(17)
  • 2009 年九月&(15)
  • 2009 年八月&(21)
  • 2009 年七月&(18)
  • 2009 年六月&(19)
  • 2009 年五月&(27)
  • 2009 年四月&(53)
  • 2009 年三月&(43)

最新评论

  • rex: 请问如果我的共享库依赖于一个其他第三方共享库,在用ctype s的时候仅加载前者会导致符号未解析,这时候应该怎么办呢?ct ypes能搞定吗?
  • wente: 好吧,我有强迫症,那个是开窍吧。。
  • hellokitty: @supersonic yes, 需要一个 secrit 字段来共同进行 md5 加密就ok了, 如果secrit 字段足够长,并且足够复杂,而且对同一个用户有访问次数限制的话 ,理论上来说是不能被破解的
  • 呵呵: 试下头像
  • 呵呵: 爱国者 : 当调用hashmap.put时,如果没有用synchroni zed关键字将它包起来,那么在高并发下才会出现这个问题,如果 用synchronized包起来是不会有这个问题的...
  • 六道: skills 休养,程序员的休养
  • 小白: 学习了, 不过我觉得这里的重点不是怎么用指针, 而是发现head和next在逻辑上的一致性。
  • 风中浮云: 学习了,感谢leo.
  • xylon: 刚看完的时候觉得有点不以为然,但仔细想想很有道理,信息安全的 问题的确有好大的隐患!这其实和我不去用360安全卫士的道理差 不多!的赶紧处理一下,因为用的qq通讯录,一样的同步了信息!
  • hellocoolshell: 好像彻底摆脱百度,比较困难,呜呜!
  • wj: 记得以前看过gosling发明java的轶事,说是因为他觉得 c++太难了。可见对一种语言表达不满最好的方法就是开发一种更 好的。
  • d瓜哥: 不错,非常漂亮!一直在用,突然不用还有点不习惯。哈哈
  • youcou12: nick : 由于平时经常要搜英语的资源基本都用google 对楼主的观点略不赞同 如文中所述 百度虽然存在缺陷 但理由不足以让人彻底放弃 我也觉得很对,对baidu的打击面太广了.如果都用go...
  • youcou12: google有什么好的,人家想分裂中国,看不起中国,还这么依 赖google,所谓的精英就是这样的.没有国还玩个屁啊
  • youcou12: 我觉得百度对中文搜索还是可以的啊, 一个工具而已啊,搞不懂

友情链接

  • 陈皓的博客
  • 并发编程
  • 四火的唠叨
  • devtext 开发者社区
  • claymore's blog
  • dutor.net
  • bones7456
  • keengle's blog
  • 简明现代魔法
  • 罗素工作室
  • 代码回音
  • hellogcc working group
  • 吕毅的blog
  • todd wei的blog
  • c++爱好者博客
  • html5研究小组
  • 12free
  • 朱文昊albert zhu
  • c瓜哥的博客
  • 开源吧
  • 靖难|魔都小码农
  • acmer
  • 陈鹏个人博客
  • onecoder
  • 狂shell – happy hacking
  • tektea's blog
  • 夕水溪下

功能

  • 注册
  • 登录
  • 文章 rss
  • 评论 rss
  • wordpress.org
回到顶部 wordpress
版权所有 © 2009-2013 酷壳 – coolshell.cn
主题由 neoease 提供, 通过 xhtml 1.1 和 css 3 验证.

随意打赏

提交建议
微信扫一扫,分享给好友吧。