MXNet之gluonCV中關於路徑的操作

GluonCV下載模型的源碼地址(test.py):

https://gluon-cv.mxnet.io/model_zoo/segmentation.html

說明

記錄這個,是因爲每次使用gluoncv的模型,系統 總是默認地址爲
C:\Users\Administrator/.mxnet
而C盤使用時間一長,就不堪重負,所以我把模型地址設爲MXNET_HOME。

 

首先:建立一個MXNET_HOME的環境變量

比如:MXNET_HOME的環境變量的內容設置爲地址 D:\MXNet_HOME,這個地址將是要下載的模型所放置的地方。不建的話,就要看有沒有‘HOME’‘USERPROFILE’‘HOMEPATH’'HOMEDRIVE'等環境變量來確定最後的地址了。

 

gluon-cv 是如何尋找路徑的:OS和SYS中的路徑操作

gluonCV是通過gluoncv\model_zoo\model_store.py中的get_model_file函數來確認模型地址的。看一下其源碼,不難理解其路徑設置的方式了,
例如,主程序是這樣獲取路徑的,
if prog is None:
            prog = _os.path.basename(_sys.argv[0])

這裏,_sys.argv[0]就是你運行的主程序(假設名字叫test.py吧)的路徑,如 ‘d:\\mxNet\\gluon_cv_tests\\ADE20K\\test.py'
prog就是得到的文字名稱,這裏是'test.py'

os.environ 表示計算機當前的全部路徑,例如下面這句,表示如果環境變量中有MXNET_HOME這個地址的話,root就選用該地址

    if 'MXNET_HOME' in os.environ:
        root = os.path.join(os.environ['MXNET_HOME'], 'models')

如果沒有MXNET_HOME這個環境變量的話,就會通過os.path.expanduser尋找用戶的默認目錄,

    root = os.path.expanduser(root)

其中,包括‘HOME’‘USERPROFILE’‘HOMEPATH’'HOMEDRIVE'等常見指定目錄的參數。函數具體實現可參考expanduser函數源碼。例如,假設用戶的默認文檔上當是:'c:\\documents\\user',那麼root的路徑就是'c:\\documents\\user/.mxnet/models'。

函數expanduser源碼如下,


def expanduser(path):
    """Expand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing."""
    path = os.fspath(path)
    if isinstance(path, bytes):
        tilde = b'~'
    else:
        tilde = '~'
    if not path.startswith(tilde):
        return path
    i, n = 1, len(path)
    while i < n and path[i] not in _get_bothseps(path):
        i += 1

    if 'HOME' in os.environ:
        userhome = os.environ['HOME']
    elif 'USERPROFILE' in os.environ:
        userhome = os.environ['USERPROFILE']
    elif not 'HOMEPATH' in os.environ:
        return path
    else:
        try:
            drive = os.environ['HOMEDRIVE']
        except KeyError:
            drive = ''
        userhome = join(drive, os.environ['HOMEPATH'])

    if isinstance(path, bytes):
        userhome = os.fsencode(userhome)

    if i != 1: #~user
        userhome = join(dirname(userhome), path[1:i])

    return userhome + path[i:]

最後,
    params_path = os.path.join(root, file_name + '.params')

設定最終模型參數的存放位置。例如,如果已經根據前面的設定建立了MXNET_HOME的位置,那這個文件的位置就是,

'D:\\MXNet_HOME\\models\\resnet101_v1s-bd93a83c.params'

 

下面是一些路徑操作的基本函數,貼到這裏備查吧。

1. os.path模塊

3.4版本之前使用os.path模塊,3.4版本之後建議使用pathlib模塊

方法 解釋
path.join 拼接一個路徑出來
path.exists 判斷該路徑是否存在
path.split 將路徑切割成頭和尾的一個元組
path.abspath 返回一個絕對路徑
path.dirname 返回‘目錄’
path.basename 返回路徑的最後一部分

2. pathlib模塊

from pathlib import Path
Path中返回的是一個Path對象,而os.path中返回的是一個字符串。

2.1 目錄操作

初始化:

屬性 解釋
parts 返回路徑中的每一個部分
joinpath 連接多個字符串到Path對象中
parent 目錄的邏輯父目錄
parents 父目錄序列,索引0是直接的父
name 目錄中的最後一部分
suffix 目錄中的最後一部分的擴展名
stem 目錄的最後一個部分,沒有後綴
suffixes 返回多個擴展名列表
with_suffix(suffix) 補充擴展名到路徑的尾部,返回新的路徑,擴展名存在則無效
with_name(name) 替換目錄最後一個部分並返回一個新的路徑
屬性 解釋
cwd() 返回當前工作目錄
home() 返回當前家目錄
is_dir() 是否是目錄
is_file() 是否是普通文件
is_symlink() 是否是軟鏈接
is_socket() 是否是socket文件
is_block_device() 是否是塊設備
is_absolute() 是否是絕對路徑
resolve() 返回一個新的路徑,該路徑是當前Path的絕對路徑,如果是軟連接則被解析
absolute() 獲取絕對路徑,推薦使用resolve()
exists() 目錄或者文件是否存在
rmdir() 刪除空目錄,沒有提供判斷目錄爲空的方法
touch() 創建一個文件
as_uri() 將路徑解析成url
mkdir() 創建目錄

通配符匹配:

  • glob(pattern) 匹配給定的模式
  • rglob(pattern) 匹配給定的模式,遞歸目錄,返回一個生成器
  • match(pattern) 模式匹配,成功返回True

查看文件或者目錄屬性信息

  • stat() 如同linux裏面的stat命令
  • lstst() 同stat(),但是如果是符號鏈接,就顯示鏈接本身的信息

2.2 文件操作

  • open(mode='r', buffering=-1, encoding=None, errors=None, newline=None如何內建的open,返回一個文件對象。
  • read_bytes() 以'rb'讀取路徑中對應的文件,並返回二進制流。
  • read_text() 以'rt'讀取路徑中對應的文件,並返回文本。
  • write_bytes(date) 以‘wb’方式寫入數據到路徑對應文件。
  • write_text(data) 以‘wt’方式寫入數據到路徑對應的文件。

3. shutil模塊

3.1 os模塊

  • os.name 返回操作系統
  • os.uname() 顯示當前操作系統的詳細信息
  • sys.platform 返回當前操作系統
  • os.listdir() 返回目錄內容的列表
  • os.stat() 如何stat
  • os.chmod() 修改文件的權限
  • os.chown() 改變文件的屬主,屬組

3.2 shutil模塊

shutil模塊提供了對文件的高級操作,特別是針對文件的複製和移動。

  • copyfileobj(fsrc, fdst[, length]) 文件對象的複製,複製內容。
  • copyfile(src, dst, *, follow_symlinks=True) 複製文件內容,不含元數據
  • copymode() 僅僅複製權限
  • copystat() 複製元數據,stat包含權限
  • copy() 複製文件內容、權限和部分元數據,不包括創建時間和修改時間
  • rmtree() 遞歸刪除,同rm -rf一樣
  • move(src,dst,copy_function=copy2) 遞歸移動文件,目錄到目錄路徑。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章