废柴学习python留档
imp.load_source(moudel,path).get_network()
最近学习大佬代码的时遇到了这样的一段代码:
import os
import imp
def get_network(cfg):
arch = cfg.network #dla_34?
heads = cfg.heads
head_conv = cfg.head_conv
num_layers = int(arch[arch.find('_') + 1:]) if '_' in arch else 0
arch = arch[:arch.find('_')] if '_' in arch else arch
get_model = _network_factory[arch]
network = get_model(num_layers, heads, head_conv)
return network
def make_network(cfg):
module = '.'.join(['lib.networks', cfg.task])
path = os.path.join('lib/networks', cfg.task, '__init__.py')
return imp.load_source(module, path).get_network(cfg)
此处get_network(cfg)其实并不是这段代码片中所定义的get_network(cfg)函数(不知道大佬在这里写一个同样名字的函数是为什么,并没有发现被调用,也可能有其他的用途),而是在path指定文件中的get_network函数。
新建一个py文件file1.py
def functiontest():
print('this is from file1')
再新建一个文件file2.py,用于导入file1.py
import imp
def functiontest():
print('this is from file2')
out=imp.load_source('test','./file1.py') #'test'是个名字而已,不知道有什么实际作用
out.functiontest()
此外,因为imp 在Python3.3以上版本中被弃用。
DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
import imp
解决方案:将其替换为importlib,load_source替换为SourceFileLoader。即:
from importlib.machinery import SourceFileLoader
out=SourceFileLoader('test','./file1.py').load_module()
out.functiontest()