Chinaunix首页 | 论坛 | 博客
  • 博客访问: 497133
  • 博文数量: 74
  • 博客积分: 750
  • 博客等级: 军士长
  • 技术积分: 1453
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-29 15:59
文章分类
文章存档

2014年(30)

2013年(8)

2012年(36)

分类: LINUX

2014-02-17 15:29:50

在python需要用到外部的C文件和C++文件,这里主要是想使用C和C++中的函数,我们需要将这些文件封装成so的动态链接库文件。
例如url的转换函数,hash编码的函数,着实不甚方便,这个时候把常用的c++的函数,封装为SO库让python调度就非常有必要的了。

  当然,如果从性能的考虑,你也可以balabal了。

  那么这里就简单描述一下在python中怎么使用so库吧。

  python中使用so库的方法很多,以下三个网页都比较好的描述了怎么操作。


  简介了各种调用so的方法。

   介绍了python与so库之间的各个映射关系。

  将了python如何调用c语言的分词块。


当需要采用调用c++的程序的时候,需要对原有的数据加一个extern "C"封装一下即可。

采用g++编译的代码也需要的,原因可能是因为c++编译器编译后的二进制so文件中,对c++的函数进行了重新的命名导致的。


extern "C" { Foo* Foo_new(){ return new Foo(); } void Foo_bar(Foo* foo){ foo->bar(); } }
以下两个网页又更详细的介绍


http://blog.waterlin.org/articles/using-python-ctypes-to-link-cpp-library.html

最后需要补充的一个问题是:当我调用so文件的时候,会发生一个有趣的现象:

我把python放到streaming找运行的时候,发现streaming始终查找不到so,但是数据却是被上传到hadoop的对应的work目录下。

后来定位到原因:

是python加载动态库方面是默认从系统lib库上查找库文件。
我的目录在当前目录下,所以需要从libdy.so变为./libdy.so

同时奇怪的是,在本地有ok。不解~ 


相对以前用java来调用so,感觉python更朴实一下哈。

阅读(9418) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~