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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM