浏览 9879 次
锁定老帖子 主题:Python的import过程
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-21
最后修改:2010-01-21
假设在/tmp/test下有个testmodule.py文件,文件内容如下: value = 'hello world' 在控制台执行下面的命令: [user@host]$ export PYTHONPATH=$PYTHONPATH:/tmp/test [user@host]$ python >>> 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移动到另外一个包下 等等 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-27
最后修改:2010-01-27
>>> import sys >>> import types >>> module = types.ModuleType('testmodule') >>> sys.modules['testmodule'] = module >>> module.value = 'hello python' >>> import testmodule >>> testmodule.value #属性不更新 'hello python' >>> reload(testmodule) >>> testmodule.value #更新属性 'Hello World' 从例子可以看出,import和reload的区别: 〔1〕 import一个module后,如果此module已经在sys.modules里有一个实例,那么不会更新这个实例的重名属性的值 〔2〕 在相同的情况下,reload(要先import同一个module,才能reload)则会更新重名属性的值 |
|
返回顶楼 | |