时间:2020-11-08 12:27:53 | 栏目:Python代码 | 点击:次
不管是用import还是用from mmmm import *的方式导入模块,当程序运行之后,回头在看那个存储着mmmm.py文件的目录中,多了一个文件:
$ ls mmm* mmmm.py mmmm.pyc
在这个目录下面,除了原来的那个mmmm.py之外,又多了一个mmmm.pyc文件,这个文件不是我写的,需要用import的过程说起。
import的工作流程
import mmmm,并不是仅仅将mmmm.py这个文件装载到当前位置(文件内),其实是首先进行了一次运算。当mmmm.py被第一次导入的时候,python首先要对其进行编译,生成扩展名为.pyc的同名文件,然后才执行mmmm模块的代码,创建相应的对象等。就如同把大象装进冰箱,有三步要执行:
搜索模块
一般情况下,python会自动的完成模块搜索过程。但是,在某些情况下,或许会要求程序员来设定搜索路径。当import一个模块后,python会按照下面的顺序来找那个将要导入的模块文件
也可以自己编写.pth文件,里面是有关搜索目录,保存到这里。比如,打开目录中的easy-install.pth文件,发现的内容:
搜索就是这么一个过程。这里建议了解即可,不一定非要进行什么设置,在很多情况下,python都是会自动完成的。特别是初学者,暂且不要轻举妄动。
重载模块
以mmmm模块为例。
在一个shell里面,运行了python,并且做了如下操作:
>>> import mmmm >>> mmmm.web 'https://hiekay.github.io'
下面我再打开一个shell,编辑mmmm.py这个文件,对web值进行适当修改:
#!/usr/bin/env python #coding:utf-8 web = "https://hiekay.github.io, I am writing a python book on line. " def my_name(name): print name class pythoner: def __init__(self,lang): self.lang = lang def programmer(self): print "python programmer language is: ",self.lang
保存之后,切换到原来的那个导入了模块的交互模式:
>>> mmmm.web 'https://hiekay.github.io'
输出的跟前面的一样,没有任何变化,这是为什么呢?
原来,当导入模块的时候,只会在第一次导入时加载和执行模块代码,之后就不会重新加载或重新执行了,如果模块代码修改了,但是这里执行的还是修改之前的。
怎么实现代码修改之后,执行新的呢?一种方式就是退出原来的交互模式,再重新进入,再import mmmm。这种方法有点麻烦。Python提供了另外一个函数――reload函数,能够实现模块的重新加载(简称重载),重载后模块代码重新执行。如下继续:
>>> reload(mmmm) <module 'mmmm' from 'mmmm.py'> >>> mmmm.web 'https://hiekay.github.io, I am writing a python book on line. '
这下就显示修改之后的内容了。
特别提醒注意:
总结