mxnet底层的代码是cpp写的, 然后在它上面封装提供了R, python, scala和matlab的接口. 我现在只关注python.

如何使用mxnet的python接口?

自然是通过import来实现了.

import mxnet as mx

但是import之前必须先把mxnet/python路径加到search path里.

至少有三种方式可以实现.

  1. 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;
  1. 将路径加到环境变量PYTHONPATH中. 修改~/.bashrc文件, 在最后面加上:
export PYTHONPATH=path_to_mxnet_root/python

保存后执行:

source ~/.bashrc
  1. 直接安装, 将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()方法.

最新文章

  1. 怎样让webservice在浏览器远程浏览时像在本地浏览一样有参数输入框
  2. canvas之特丑时钟
  3. C++:常类型Const
  4. ng-if与ng-show、ng-hide指令的区别和注意事项
  5. 针对Yii框架的nginx配置
  6. homebrew & brew cask使用技巧及Mac软件安装
  7. SQLServer之创建标量函数
  8. HDOJ 4267 A Simple Problem with Integers (线段树)
  9. poj2109 【贪心】
  10. shell(1)
  11. 杨其菊201771010134《面向对象程序设计Java》第二周学习总结
  12. etcd raft如何实现leadership transfer
  13. 使用fiddler模拟http请求
  14. Proxmox Reset Root Password
  15. 把多个js函数绑定到onload时间处理函数上
  16. windows使用
  17. pythonl练习笔记——threading创建进程锁Lock()
  18. package.json文档
  19. quick cocos2d-x 2.2.4 window环境调试
  20. 【C#】datetimepicker初始为空值的方法

热门文章

  1. Student学生管理系统
  2. 嵌入式Linux驱动学习之路(三)u-boot配置分析
  3. java 24 - 1 GUI之GUI的概述和基本代码
  4. 转: Eclipse 分屏显示同一个文件
  5. Python的高级特性11:拓展基本数据类型(dict)
  6. php常见问题以及解决方法
  7. mysql中判断记录是否存在方法比较
  8. mysql ERROR 1045 (28000): Access denied for user解决方法
  9. 清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)
  10. Jboss EAP:native management API学习