Swig简单实验和理解

一 问题起源

在看tensorflow的源码的时候,发现python调用c++框架是如何实现的引起了我的好奇,发现编译的时候使用的是Swig

操作环境

为了搞清楚swig使用方法,简单做了一个实验验证Swig; Swig是一个独立库可以让用户使用python调用c++程序;

环境问题

tensorflow本身在编译依赖的时候都是直接下载对应的库放在一个临时编译目录

比如我的编译路径如下,注意红色的部分每个工程编译都是一个独立的目录,其实tensorflow这样搞也有好处,多个工程之间不耦合;但是对我们验证Swig程序会有影响,因为不在标准的lib库下

/root/.cache/bazel/_bazel_root/014e8ed0b29435778e37e53e83f1c80c/execroot/org_tensorflow/bazel-out/k8-opt/bin/tensorflow/python/tools/inspect_checkpoint.runfiles/org_tensorflow/tensorflow/python/pywrap_tensorflow_internal.py

解决办法:

只是做测试,所以干脆暴力单独拷贝swig库测试

创建独立测试目录 /home/test_swig;拷贝可执行程序swig到上面的/home/test_swig目录,执行过程中可能会报错,直接去tensorflow路径下找对应的文件就可以了,肯定能找到的,找到后拷贝到一起的样子如下:

 

二 编写测试程序

  1. 比如我们写一个example.c的文件

/* File : example.c */

double  My_variable  = 3.0;

/* Compute factorial of n */
int fact(int n) {
  if (n <= 1)
    return 1;
  else
    return n*fact(n-1);
}

/* Compute n mod m */
int my_mod(int n, int m) {
  return(n % m);
}

2. 导出文件写一个example.i

/* File : example.i */
%module example
%{
/* Put headers and other declarations here */
extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);
%}
 
extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);

3.  编译执行

$swig -python example.i
$gcc -c -fpic example.c example_wrap.c -I/usr/local/python36/include/python3.6m/
$gcc -shared example.o example_wrap.o -o _example.so
$python    
>>> import example
>>> example.fact(4)

最后生成出的文件

so _example.so

example_wrap.c

example.py

 4.  分析讨论(验证玩一下)

  (1)对比tensorlfow导出的/pywrap_tensorflow_internal.cc 和example_wrap.c发现基本一样都是3000行代码,而别地方不同;原因大家自己分析吧,我还在研究

(2)查看example.py中的代码 是在加载_example.so ;其他没啥逻辑

     使用打印日志的方式可以显示出加载的路径  

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值