看大家说的比较多的是都是c、c++来调用python。而用python来调用c的,或者c来
写python的扩展的,文档多是说可以这么做?但具体的步骤都很少,或者是简单的
hello world程序。
--
feihu <feihu...@gmail.com>
现在我已经有一些c写的lib(有源码的),想在python里
调用,应该使用什么?
看大家说的比较多的是都是c、c++来调用python。而用python来调用c的,或者c来
写python的扩展的,文档多是说可以这么做?但具体的步骤都很少,或者是简单的
hello world程序。
1,先生成简单的lib:
=>vi test.h
int tadd(int a, int b);
=>vi test.c
#include "test.h"
int tadd(int a, int b)
{
return a+b;
};
=>gcc -c test.c
生成test.o
=>ar -rsv libtest.a test.o
生成了 libtest.a 静态库
2,我们测试一下这个lib可以用吗?
=>vi ttest.c
#include <stdio.h>
#include "test.h"
void main(int argc, void * argv[])
{
int c=1;
c = tadd(1, 4);
printf("c = %d \r\n", c);
}
=>gcc ttest.c -ltest -L.
生成了a.out
./a.out 结果是:
c = 5
证明我们的lib库是可以正常工作的
3,写一个python的模块td,调用它libtest里的tadd()函数
写一个pyx,
=>vi td.pyx
cdef extern from "test.h":
int tadd(int i, int j)
def tdadd(int i, int j):
cdef int c
c=tadd(i, j)
return c
就在这行调用的:c=tadd(i, j)了。
编译:
=>pyrexc td.pyx
生成 td.c
=>gcc -c -fPIC -I/usr/include/python2.4/ td.c
生成td.c
=>gcc -shared td.o -ltest -L. -o td.so
生成了td.so。这个就是python可以用的模块so了
安装:
=>vi setup.py
from distutils.core import setup
from distutils.extension import Extension
from Pyrex.Distutils import build_ext
setup(
name = "PyrexGuide",
ext_modules=[
Extension("td", ["td.pyx"], libraries = ["test"])
],
cmdclass = {'build_ext': build_ext}
)
=>python setup.py build_ext --inplace
测试:
>>> import td
>>> dir(td)
['__builtins__', '__doc__', '__file__', '__name__', 'tdadd']
>>> td.tdadd(1,2)
3
呵呵,OK了。
等会再试一试ctypes
> 使用pyrex,如果需要在Python代码总访问C代码的Struct和Union,比较麻烦。
> 参考:http://lists.copyleft.no/pipermail/pyrex/2005-July/001277.html
> 所以建议你使用ctypes,文档见python2.5标准库文档
--
feihu <feihu...@gmail.com>
--
'''Time is unimportant, only life important!
blog@ http://blog.zoomquiet.org/pyblosxom/
wiki@ http://wiki.woodpecker.org.cn/moin/ZoomQuiet
douban@ http://www.douban.com/people/zoomq/
____________________________________
Please use OpenOffice.org to replace M$ office.
http://zh.openoffice.org
Please use 7-zip to replace WinRAR/WinZip.
http://7-zip.org/zh-cn/
You can get the truely Freedom from software.
'''
--
I like python!
UliPad <<The Python Editor>>: http://wiki.woodpecker.org.cn/moin/UliPad
My Blog: http://www.donews.net/limodou
Pyrex 是自动将Python 脚本转化为可编译的C 代码,以便高效执行和被C程序调用;
已经有两篇 混合编程的我们自个儿的教程了!
http://wiki.woodpecker.org.cn/moin/Pyrex
哈哈哈!大家努力,相互分享学习成果哪!
> --
> I like python!
> UliPad <<The Python Editor>>: http://wiki.woodpecker.org.cn/moin/UliPad
> My Blog: http://www.donews.net/limodou
>
先把刚才的静态test.o编译成动态链接库:
=>gcc -shared test.o -o test.so
然后=>python
>>> from ctypes import *
>>> libt = CDLL("test.so")
>>> libt
<CDLL 'test.so', handle 81ae8b0 at b7de004c>
>>> a= libt.tadd(1, 3)
>>> print a
4
哇哇,好像更加方便了。
总结:
两者都是扩展了python调用外部lib途径。好像pyrex更强调调用静态的lib,而且是把lib编译成python自己原生的module。
为了做到这个,除了有lib的.a文件外,必须要有lib的.h文件。
ctypes则是显示的调用动态的lib,只要有lib的.so,.dll就可以,目前ctypes已经成为2.5的内部module。
而pyrex还有一个比较重要特点就是可以用类c的语法写python的moduele。
比较同意这个观点:
> 我觉得 Pyrex 主要是用来为 c 库 提供一个 pythinic 的接口,而非优化python程序。
目前的例子非常简单,复杂情况下的调用有可能出现的问题都还没有碰到。Zoom给的文章里说到的复杂的结构,联合的情况
也还没有尝试。
想到要调用的lib的线程,指针,内存块操作,就有点头痛。
初步还是决定采用ctypes的方式,工作量上要少写一点东西,至少调试的时候也更直接一点。
一切都根据实际情况来做吧,要试错。
--
feihu <feihu...@gmail.com>
feihu wrote:
> 现在我已经有一些c写的lib(有源码的),想在python里调用,应该使用什么?
>
> 看大家说的比较多的是都是c、c++来调用python。而用python来调用c的,或者c来
> 写python的扩展的,文档多是说可以这么做?但具体的步骤都很少,或者是简单的
> hello world程序。
>
包装现成的c lib, 最简单的方法, 用swig包装一下就搞定了.
看这里, http://www.swig.org/tutorial.html
_______________________________________________
python-chinese
Post: send python-...@lists.python.cn
Subscribe: send subscribe to python-chin...@lists.python.cn
Unsubscribe: send unsubscribe to python-chin...@lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese
刘鑫 wrote:
> 如果说对C++语言的封装,Boost::Python绝对是非常强大的。当然Boost更适合"
> 使用Python的C++程序员",对"想要使用C++的Python程序员",Boost可能稍有点
> 艰深。
>
对于想要使用c lib的Python程序员Boost::Python就更用不上了. 而且如果编译时
出点奇怪的C++的错误, 会让Python程序员头大.
> 2006/12/6, Jacob Fan <ja...@exoweb.net <mailto:ja...@exoweb.net>>:
>
> feihu wrote:
> > 现在我已经有一些c写的lib(有源码的),想在python里调用,应该使用
> 什么?
> >
> > 看大家说的比较多的是都是c、c++来调用python。而用python来调用c
> 的,或者c来
> > 写python的扩展的,文档多是说可以这么做?但具体的步骤都很少,或者
> 是简单的
> > hello world程序。
> >
> 包装现成的c lib, 最简单的方法, 用swig包装一下就搞定了.
> 看这里, http://www.swig.org/tutorial.html
> _______________________________________________
>
_______________________________________________
python-chinese
Post: send python-...@lists.python.cn
Subscribe: send subscribe to python-chin...@lists.python.cn
Unsubscribe: send unsubscribe to python-chin...@lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese
刘鑫 写道:
> 对啊,而且Boost对于习惯了纯C代码的人来说,恐怕编译速度太慢了:P
>
> 2006/12/6, Jacob Fan < ja...@exoweb.net <mailto:ja...@exoweb.net>>:
>
> 刘鑫 wrote:
> > 如果说对C++语言的封装,Boost::Python绝对是非常强大的。当然Boost
> 更适合"
> > 使用Python的C++程序员",对"想要使用C++的Python程序员",Boost可能
> 稍有点
> > 艰深。
> >
> 对于想要使用c lib的Python程序员Boost::Python就更用不上了. 而且如果
> 编译时
> 出点奇怪的C++的错误, 会让Python程序员头大.
> > 2006/12/6, Jacob Fan <ja...@exoweb.net <mailto:ja...@exoweb.net>
> <mailto: ja...@exoweb.net <mailto:ja...@exoweb.net>>>:
> >
> > feihu wrote:
> > > 现在我已经有一些c写的lib(有源码的),想在python里调用,应该使用
> > 什么?
> > >
> > > 看大家说的比较多的是都是c、c++来调用python。而用python来调用c
> > 的,或者c来
>
就是,前一段时间研究过boost::python,是挺好用,但就像前面说的,我是希
望用python的c++程序员,而且是正在用n个c++库的程序员,想要转行真的好难呀
_______________________________________________
python-chinese
Post: send python-...@lists.python.cn
Subscribe: send subscribe to python-chin...@lists.python.cn
Unsubscribe: send unsubscribe to python-chin...@lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese