有关Python的import过程

发布时间:2020-01-29编辑:脚本学堂
本文介绍下,有关python中的import过程的相关知识,有需要的朋友参考下吧。

1. import的过程
假设在/tmp/test下有个testmodule.py文件,文件内容如下:
 

复制代码 代码示例:
value = 'hello world'   

在控制台执行下面的命令:
 

复制代码 代码示例:
[user@host]$ export pythonPATH=$PYTHONPATH:/tmp/test
[user@host]$ python
    >>> import testmodule    
    >>> print testmodule.value   
     
    >>> import testmodule 
    >>> print testmodule.value
 

这时就会看到屏幕上会输出"Hello World"字样

这个过程中python究竟干了些什么呢?

以下是俺的个人理解,不知道对不对?呵呵。
首先,查找sys.modules,判断testmodule是否已经被加载。如果已经被加载,则使用已经加载过的testmodule
如果没有加载过,则在sys.path下查找,找到后创建testmodule对象,并把创建后的testmodule保存在sys.modules变量中。

下面做几个小实验:

实验1:
  

复制代码 代码示例:
  >>> import sys    
    >>> sys.modules.has_key('testmodule')    
    False   
    >>> import testmodule    
    >>> sys.modules.has_key('testmodule')    
    True   

上面的实验验证了,python会把加载过的module放在sys.modules变量中

实验2
 

复制代码 代码示例:
   >>> import os    
    >>> import testmodule    
    >>> testmodule.value    
    'hello world'   
    >>> os.system("echo 'value=0' > /tmp/test/testmodule.py") #将testmodule.py中的代码改为"value = 0"    
    >>> import sys    
    >>> del sys.modules['testmodule']    
    >>> import testmodule    
    >>> print testmodule.value    
    0   
 

这时发现第二次打印的testmodule.value,值就变成了0。这个实验说明,如果在sys.modules中找不到module,则会重新加载。

实验3:
   

复制代码 代码示例:
>>> import sys    
    >>> import types    
    >>> module = types.ModuleType('testmodule')    
    >>> sys.modules['testmodule'] = module    
    >>> module.value = 'hello python'   
    >>> import testmodule    
    >>> testmodule.value    
    'hello python'   
    >>>   
 

实验3表明了,即使在PYTHONPATH下不存在的module,只要在sys.modules中能够找到,也能import。

对python的import的方式有了一定的认识之后,就可以实现下面的功能:
 

1,在运行期设置pythonpath
2,动态创建python代码并执行之
3,动态创建module
4,在运行期将一个module移动到另外一个包下等

有关python教程的更多内容,请参考本站的python栏目。