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']

results matching ""

    No results matching ""