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()方法.
mxnet的python包导入的前前后后的更多相关文章
- python 包导入规则
python 包导入规则,恶心了一天,终于搞清楚了 1.目录 speed data __init__.py __init__.py static templates view __init__.py ...
- 【转】python包导入细节
[转]python包导入细节 包导入格式 导入模块时除了使用模块名进行导入,还可以使用目录名进行导入.例如,在sys.path路径下,有一个dir1/dir2/mod.py模块,那么在任意位置处都可以 ...
- python包导入细节
包导入格式 导入模块时除了使用模块名进行导入,还可以使用目录名进行导入.例如,在sys.path路径下,有一个dir1/dir2/mod.py模块,那么在任意位置处都可以使用下面这种方式导入这个模块. ...
- Python 包导入
首先我们先了解下python中寻找模块的顺序 是否是内建模块 ->主目录 ->PYTHONPATH环境变量 ->标准库 -> 首先判断这个model是否是built-in,即内 ...
- python包导入
https://www.cnblogs.com/foremostxl/p/9501663.html
- 将python包发布到PyPI和制作whl文件
参考链接:wheel和egg的不同怎样将自己写的包传达到PyPi发布你自己的轮子 - PyPI打包上传实践PyPI官网上传包教程 wheel文件Wheel和Egg都是python的打包格式,目的是支持 ...
- Python 包的相对导入讲解
[Python 包的相对导入讲解] 参考:http://www.dai3.com/python-import.html
- Python 学习 第十五篇:模块搜索路径和包导入
在导入自定义的模块时,除了指定模块名之外,也需要指定目录,由于Python把目录称作包,因此,这类导入被称为包导入.包导入把计算机上的目录变成Python的命名空间,而目录中所包含的子目录和模块文件则 ...
- python之块包导入
一.模块 1.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写 ...
随机推荐
- AC日记——计算多项式的导函数 openjudge 1.5 38
38:计算多项式的导函数 总时间限制: 1000ms 内存限制: 65536kB 描述 计算多项式的导函数是一件非常容易的任务.给定一个函数f(x),我们用f'(x)来表示其导函数.我们用x^n来 ...
- 炮(棋盘DP)
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...
- OpenSessionInview
Open Session In View模式的主要思想是:在用户的每一次请求过程始终保持一个Session对象打开着 实现步骤: 步骤一.创建一个Web项目,创建包cn.happy.util,创建Hi ...
- 关于数组的map、reduce、filter
map:map()方法定义在Array中,传入自己的参数,就得到一个新的Array作为结果 var aqiData = [ ["北京", 90], ["上海", ...
- combobox 属性、事件、方法
一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...
- android listView嵌套gridview的使用心得
在开发的过程中可能需要用到listview嵌套gridview的场景,但是在Android中, 不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动 ...
- oracle存储过程中的if...elseif...else用法
if ... then ... elsif ... then ... else ... end if; or if ... then ... else ... end ...
- linux下DHCP服务原理总结
DHCP(全称Dynamic host configuration protocol):动态主机配置协议DHCP工作在OSI的应用层,可以帮助计算机从指定的DHCP服务器获取配置信息的协议.(主要包括 ...
- php base64 原理
#include <stdio.h> #include <stdlib.h> #include <string.h> static const char base6 ...
- php加载xml编码错误,“Error: Input is not proper UTF-8, indicate encoding! ”
最近在给php中解析xml的时候,抛出一个错误: "Warning: DOMDocument::load(): Input is not proper UTF-8, indicate enc ...