在看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的文件
double My_variable = 3.0; int fact(int n) { if (n <= 1) return 1; else return n*fact(n-1); } int my_mod(int n, int m) { return(n % m); }2. 导出文件写一个example.i
%module example %{ 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条)