zoukankan      html  css  js  c++  java
  • mxnet的python包导入的前前后后

    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()方法.

  • 相关阅读:
    洛谷 P2234 [HNOI2002]营业额统计
    洛谷p3146&p3147
    洛谷 p1439 最长公共子序列
    搜索
    一步一步分析Caliburn.Micro(二:绑定执行方法Message现学现卖之自定命令)
    一步一步分析Caliburn.Micro(一:绑定执行方法Message)
    整理的C# 字符串类
    不用ADOX.CatalogClass创建Access数据库文件
    取远程网页数据 WebClient,HttpWebRequest
    C# LinQ 与 ADO.NET
  • 原文地址:https://www.cnblogs.com/dengdan890730/p/5587542.html
Copyright © 2011-2022 走看看