imp (Python 2)
imp.load_source()
简介
imp.load_source()
可以用来动态地加载模块,何谓动态加载呢。简单是就是某个模块并未在import
的搜索路径,临时又需要用一下,但又不想安装它,此时就可以用该函数加载所需模块。
语法
imp.load_source(name, pathToFile)
似乎有第三个可选的参数,但是不是很理解,所以先不管了,不影响我现在的使用。
参数
- name -- 给加载进来的Python源文件赋予个名字,方便后续操作
- pathToFile -- 指向所需导入的源文件的路径
返回值
返回一个模块,具体看示例理解。
示例
(biomedickeras) mountain@Mountain:~$ cd GitHub/FC-DenseNet/
(biomedickeras) mountain@Mountain:~/GitHub/FC-DenseNet$ ls
config DenseNet.jpg metrics.py test.py weights
data_loader.py FC-DenseNet.py metrics.pyc train.py
DenseBlock.jpg layers.py README.md Untitled.ipynb
(biomedickeras) mountain@Mountain:~/GitHub/FC-DenseNet$ ipython
Python 2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:09:15)
Type "copyright", "credits" or "license" for more information.
IPython 5.3.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import imp
In [2]: module = imp.load_source('source', 'metrics.py')
In [3]: type(module)
Out[3]: module
In [4]: type(source)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-4-17feb25862de> in <module>()
----> 1 type(source)
NameError: name 'source' is not defined
In [5]: import source
In [6]: type(source)
Out[6]: module
In [7]: module == source
Out[7]: True
说明
imp.load_source(name, pathToFile)
会加载并初始化pathToFile,所谓初始化现在我所理解的就是编译过程,即用.py
文件生成pyc
文件,并把这个初始化的文件赋予name。有几点需要注意:
imp.load_source()
返回的直接是一个导入后的模块,效果和import name
相同,见上例- 如果pathToFile指向的文件所在的文件夹有与pathToFile所指向的文件同名的
.pyc
文件的话,Python会直接加载该对应的.pyc
文件,而不是源文件 - 如果你已经将某个name赋予了某个加载的文件,比如pathToFile1,当再将name赋予另一文件时,例如pzthToFile2,Python会将二者名空间不重叠的部分合并,对于名空间重叠部分,会以后加载的文件覆盖前一个,具体可通过下例理解。
首先在同意文件夹下建立三个文件:
# First file x.py
def funcA():
print "funcA of x.py"
def funcB():
print "funcB of x.py"
# Second file y.py
def funcB():
print "funcB of y.py"
# Third file test.py
import sys, imp
# load x.py as fff
m = imp.load_source('fff', 'x.py')
print dir(m)
print sys.modules.get('fff')
# load y.py as fff
m = imp.load_source('fff', 'y.py')
print dir(m)
print sys.modules.get('fff')
# import and exec func
import fff
fff.funcA()
fff.funcB()
print dir(fff)
接下来运行test.py,得到结果如下:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
<module 'fff' from 'x.py'>
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
<module 'fff' from 'y.py'>
funcA of x.py
funcB of y.py
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']