python call c

上面提到了Python 的扩展机制,缺点是工作量比较大,这里介绍一个工具 SWIG 。 SWIG 是一种简化脚本语言与 C/C++ 接口的开发工具,通过包装和编译 C 语言程序来达到与脚本语言通讯目的的工具。它正是基于 Python 的扩展机制,自动生成接口文件,再编译成可以被 Python 调用的动态库扩展模块。

  使用SWIG 生成扩展模块分为以下几步:

1.将需要调用的代码编译成目标文件(.o) ;
2.用SWIG 读取编写描述文件 (.i) ,生成接口文件 (.cxx) ;
3.将接口文件编译为目标文件(.o) ;
4.将接口文件的目标文件和原代码段的目标文件一起编译成动态库 ;
假设有如下文件

  swig_ex.cpp
需要转换成扩展库的原始代码,包含一个int fact(int) 函数

  swig_ex.h 
原始代码的头文件

  swig_ex.i
SWIG描述文件

  swig_ex.i是一个描述文件,有 SWIG
自己的语法,比较简单,内容如下:

%module
swig_ex
%{
    #define
SWIG_FILE_WITH_INIT
    #include
"swig_ex.h"
%}
int fact(int
n);

  再写一个Makefile 来把这些文件编译成动态库 :

all: swig_ex.o
swig_ex_wrap.o _swig_ex.so
swig_ex.o: swig_ex.cpp swig_ex.h
#编译源文件
   g++ -fPIC
-c swig_ex.cpp
swig_ex_wrap.o: swig_ex.i swig_ex.o
#根据 SWIG 描述文件 (.i) 生成接口文件 (.cxx) ,再编译之
   swig -c++ -python
swig_ex.i
   g++
-O2 -fPIC -c swig_ex_wrap.cxx
-I/home/work/linyi/autoframe/tool/python/include/python2.6/
_swig_ex.so: swig_ex_wrap.o
#将目标文件打包成动态库
   g++
-shared swig_ex.o swig_ex_wrap.o -o _swig_ex.so
.PHONY: clean
clean:
   rm -rf swig_ex_wrap.* swig_ex.py
_swig_ex.so

  编译好以后会有一个so 和 py 文件,写一个 setup.py 把他们安装到 python 目录就可以和其他模块一样被 python 调用了:


 Import
swig_ex
swig_ex.fact(10)

   参考文档地址:http://www.swig.org/Doc1.3/SWIGDocumentation.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值