train.py文件
1.FILE = Path(__file__).resolve()
__file__代表的是train.py文件,Path(__file__).resolve()结果是train.py文件的绝对路径。
2.ROOT = FILE.parents[0]
获得train.py父目录的绝对路径
3.sys.path
是一个列表list,里面包含了已经添加到系统的环境变量路径。
当导入一个模块时,默认情况下python解释器会搜索当前目录、已安装的内置模块和第三方模块。搜索路径放在sys模块的path中。sys模块包含与python解释器和它的环境有关的函数,可以通过dir(sys)来查看方法和成员属性。
4.可以永久的将路径添加到sys.path中:
(1)将写好的py文件添加到系统环境变量的目录下。
(2)在 /usr/lib/python10/site-packages 下面新建一个.pth 文件(以pth作为后缀名);将模块的路径写进去,一行一个路径,如: vim pythonmodule.pth
/home/liu/shell/config /home/liu/shell/base
(3)使用PYTHONPATH环境变量
export PYTHONPATH=$PYTHONPATH:/home/user/shell/config
5.导入自定义模块
当引用模块和执行脚本文件不在同一个目录时,可按照如下形式添加路径:
(1)导入的包在另一个项目文件,在运行程序过程中,需要先加载导入的包,加载过程中python解释器会默认sys.path搜索路径取搜索。
(2)如果该包无法通过sys.path路径搜索,就需要将该包的搜索路径添加到自己程序脚本的默认搜索路径,重新运行程序。
import sys sys.path.append(’引用模块的地址') sys.path.append("..") # 添加当前路径的上一级目录
这种方法只作用于脚本运行时,运行之后路径导入就会失效。
6.ROOT = Path(os.path.relpath(ROOT, Path.cwd()))
os模块是一个对接操作系统的模块。
python中的cwd是current work dir 的意思,就是当前工作目录。当前工作目录并不是你运行的python文件所在的目录就叫做工作目录,而是你在命令行中运行脚本时,命令行显示你所在的目录。当前工作目录并不是你运行的python文件所在的目录就叫做工作目录,而是你在命令行中运行脚本时,命令行显示你所在的目录。Path.cwd()获取的位置就是终端所在的位置。
os.path.relpath()用于从当前工作目录或给定目录获取给定路径的相对文件路径。
os.path.relpath(path, start = os.curdir)
给定路径的相对路径将相对于start指示的目录进行计算。此参数的默认值为os.curdir,它是操作系统用来引用当前目录的常量字符串。
7.os.getenv('LOCAL_RANK', -1),用于多卡训练控制参数。
LOCAL_RANK = int(os.getenv('LOCAL_RANK', -1)) # 本地序号,是这台机器上的第几个Worker
RANK = int(os.getenv('RANK', -1)) # 进程序号。这个Worker是全局第几个 Worker
WORLD_SIZE = int(os.getenv('WORLD_SIZE', 1)) # 总共有几个 Worker
'''查找名为LOCAL_RANK,RANK,WORLD_SIZE的环境变量,若存在则返回环境变量的值,若不存在则返回第二个参数(-1,默认None)
rank和local_rank的区别: 两者的区别在于前者用于进程间通讯,后者用于本地设备分配。
'''
os.getenv(key, default = None)
返回环境变量键的值(如果存在),否则返回默认值。
8.parser.add_argument('--quad', action='store_true', help='quad dataloader')
这个四元组函数重新调整批处理,从16x3x640x640 调整为 4x3x1280x1280。他仅仅是重新排列批处理中的马赛克。 他允许批处理过程中某些图像进行2倍放大。
9.vars()函数:以字典形式返回参数中每个成员的当前值。
print_args(vars(opt))
10.可复用代码:递增文件或目录路径
from pathlib import Path
import os
def increment_path(path, exist_ok=False, sep='', mkdir=False):
# Increment file or directory path, i.e. runs/exp --> runs/exp{sep}2, runs/exp{sep}3, ... etc.
path = Path(path) # os-agnostic
# 如果文件路径存在并且不创建
if path.exists() and not exist_ok:
path, suffix = (path.with_suffix(''), path.suffix) if path.is_file() else (path, '')
# Method 1
# 增加第n个文件夹名称,直到该文件夹不存在,跳出循环,创建该文件
for n in range(2, 9999):
p = f'{path}{sep}{n}{suffix}' # increment path
if not os.path.exists(p): #
break
path = Path(p)
# Method 2 (deprecated)
# dirs = glob.glob(f"{path}{sep}*") # similar paths
# matches = [re.search(rf"{path.stem}{sep}(\d+)", d) for d in dirs]
# i = [int(m.groups()[0]) for m in matches if m] # indices
# n = max(i) + 1 if i else 2 # increment number
# path = Path(f"{path}{sep}{n}{suffix}") # increment path
if mkdir:
path.mkdir(parents=True, exist_ok=True) # make directory
return path