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) 递归移动文件,目录到目录路径。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章