mxnet的python包导入的前前后后
mxnet底层的代码是cpp写的, 然后在它上面封装提供了R, python, scala和matlab的接口. 我现在只关注python.
如何使用mxnet的python接口?
自然是通过import来实现了.
import mxnet as mx
但是import之前必须先把mxnet/python路径加到search path里.
至少有三种方式可以实现.
- python代码手动加载
import os, sys;
cur_path = os.path.abspath(os.path.dirname(__file__));
mxnet_lib_path = os.path.join(cur_path, 'mxnet/python');
sys.path.append(mxnet_lib_path);
import mxnet as mx;
- 将路径加到环境变量PYTHONPATH中. 修改
~/.bashrc
文件, 在最后面加上:
export PYTHONPATH=path_to_mxnet_root/python
保存后执行:
source ~/.bashrc
- 直接安装, 将mxnet变成全局的.
python setup.py install --user
那么运行这行命令时发生了什么事情呢?
它在~/.local
创建了一个lib文件夹, 里面有一个python-2.7/site-packages
文件夹. 如果是使用sudo执行:
sudo python setup.py install
那么这个文件夹则在/usr/lib
下面. 这个site-packages文件夹里包含的mxnet.xx.x.egg文件夹类似于java里的jar包. 进去后可以看到里面包含了mxnet的动态库和python库脚本.
site-packages文件夹里的包是可以直接使用的, 因为它已经被自动加到了sys.path变量里.
mxnet的mnist测试案例为什么可以在执行python setup.py之前正常运行?
在mxnet的installation guidance里, 它是先说可以执行mnist测试脚本, 然后再执行setup.py. 一开始还以为它写错了. 今天仔细看了看,
python example/image-classification/train_mnist.py --network lenet --gpus 0
train_mnist.py里的第一行为:
import find_mxnet
而find_mxnet.py的内容是:
try:
import mxnet as mx
except ImportError:
import os, sys
curr_path = os.path.abspath(os.path.dirname(__file__))
sys.path.append(os.path.join(curr_path, "../../python"))
import mxnet as mx
也就是说, 在运行setup.py之前执行这个测试案例时, 它是通过上面说的第一种途径导入mxnet包的.
python 接口层是怎样与cpp代码衔接起来的?
mxnet python 里提供的大部分接口方法都不是在python中直接定义, 而是通过类似于注入的方式将cpp代码中定义好的方法复制到python对象里. 那么这个过程是什么时候, 在哪里完成的呢?
在io.py里有_init_io_module()
方法, 它将mxnet.so中的data iterator都取出来, 然后作为属性赋给对应的python对象: mx.io. 其他一些需要调用底层cpp方法的接口, 应该也是通过这种办法与cpp代码衔接起来的, 如symbol.py里对应的也有_init_symbol_module()
方法.
那么, 这个注入的过程是什么时候发生的呢? 第一次import相应的模块时发生, 通过执行对应的_init_xxx_module()
方法.
最新文章
- 怎样让webservice在浏览器远程浏览时像在本地浏览一样有参数输入框
- canvas之特丑时钟
- C++:常类型Const
- ng-if与ng-show、ng-hide指令的区别和注意事项
- 针对Yii框架的nginx配置
- homebrew &; brew cask使用技巧及Mac软件安装
- SQLServer之创建标量函数
- HDOJ 4267 A Simple Problem with Integers (线段树)
- poj2109 【贪心】
- shell(1)
- 杨其菊201771010134《面向对象程序设计Java》第二周学习总结
- etcd raft如何实现leadership transfer
- 使用fiddler模拟http请求
- Proxmox Reset Root Password
- 把多个js函数绑定到onload时间处理函数上
- windows使用
- pythonl练习笔记——threading创建进程锁Lock()
- package.json文档
- quick cocos2d-x 2.2.4 window环境调试
- 【C#】datetimepicker初始为空值的方法
热门文章
- Student学生管理系统
- 嵌入式Linux驱动学习之路(三)u-boot配置分析
- java 24 - 1 GUI之GUI的概述和基本代码
- 转: Eclipse 分屏显示同一个文件
- Python的高级特性11:拓展基本数据类型(dict)
- php常见问题以及解决方法
- mysql中判断记录是否存在方法比较
- mysql ERROR 1045 (28000): Access denied for user解决方法
- 清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)
- Jboss EAP:native management API学习