需求说明

在跑模型实验时,由于经常会对网络结构进行修改并且多程序并行训练,这就容易造成训练结果与网络模型无法匹配的问题,所以就需要将当前的网络模型代码与训练代码一同移入到日志文件夹中。

解决方法

根据模型对象确定模型所在文件,利用shutil.copy()方法复制文件

1
2
3
4
5
6
7
8
9
10
11
12
import sys
import shutil
from pathlib import Path

model = modelClass()
trainer = trainerClass()

model_path = Path(sys.modules[model.__module__].__file__)
shutil.copy(model_path, log_path / model_path.name)

trainer_path = Path(sys.modules[model.__module__].__file__)
shutil.copy(trainer_path, log_path / trainer_path.name)

说明

__module__

返回当前操作的对象在哪个模块,返回值是字符串类型。

sys.modules

sys.modules是一个全局字典,该字典记载了加载在内存中的模块。每当导入新的模型,sys.modules都会记录这些模块,第二次再导入时,python会直接到字典中查找。

可以按照字典的方法进行操作,如:

  1. sys.modules.keys()
  2. sys.modules.values()
  3. sys.modules.items()

sys.modules[‘name’]返回是模块对象类。

__file__

返回模块所在的存储位置。

shutil.copy

1
shutil.copy(source, destination, *, follow_symlinks = True)

source:代表源文件路径的字符串。
destination:代表目标文件或目录路径的字符串。
follow_symlinks(可选):此参数的默认值为True。如果为False,并且source表示符号链接,则目标将创建为符号链接。

类与模块

将类储存在一个单独的文件时,这个文件就被成为模块(module),在一个模块中可以写入任意数量的类。所以在导入时,可以采用如下方法:

1
2
3
4
import module_name                   # 导入模块

from module_name import name # 导入模块中的某个类或函数
from module_name import * # 导入模块中所有的类或函数