python中的import详解_详解Python中的import过程

本节内容:

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

Fa

lse

>>> import testmo

dule

>>> 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中的import详解_详解Python中的import过程)