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

这时我们就会看到屏幕上会输出"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移动到另外一个包下
等等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值