跟老齐学Python之模块的加载


Posted in Python onOctober 24, 2014

不管是用import还是用from mmmm import *的方式导入模块,当程序运行之后,回头在看那个存储着mmmm.py文件的目录中(关于mmmm.py文件可以看上一讲),多了一个文件:

qw@qw-Latitude-E4300:~/Documents/ITArticles/BasicPython/codes$ ls mmm*
mmmm.py mmmm.pyc
在这个目录下面,除了原来的那个mmmm.py之外,又多了一个mmmm.pyc文件,这个文件不是我写的,是哪里来的呢?

要破开此迷,需要用import的过程说起。

import的工作流程

import mmmm,并不是仅仅将mmmm.py这个文件装载到当前位置(文件内),其实是首先进行了一次运算。当mmmm.py被第一次导入的时候,python首先要对其进行编译,生成扩展名为.pyc的同名文件,然后才执行mmmm模块的代码,创建相应的对象等。就如同把大象装进冰箱,有三步要执行:

搜索。就是python要能够找到import的模块。怎么找到,后面讲述。编译。找到模块文件之后,将其编译成字节码,就是那个.pyc文件里面的(关于字节码,下面会介绍,请继续阅读)。注意,不是什么时候都编译的,只有第一次运行时候才编译,如果mmmm.py文件改变了,相当于又一个新文件,也会从新编译。其实就是.pyc文件中有一个时间戳,python会自动检查这个时间戳,如果它比同名的.py文件时间戳旧,就会从新编译。否则跳过。当然,如果根本就没有找到同名的.py源文件,只有字节码文件.pyc,那么就只能运行这个了。运行。这就没什么好说的了,生米已经淘干净了,并且放到锅里,开始加热了,最后就只能熟饭了。执行就是前面已经编译的模块字节码文件,顺理成章要执行了。搜索模块

一般情况下,python会自动的完成模块搜索过程。但是,在某些情况下,或许会要求程序员来设定搜索路径。当import一个模块后,python会按照下面的顺序来找那个将要导入的模块文件

程序的主目录。上一讲中,在codes这个目录中运行交互模式,这时候的主目录就是codes,当在那个交互模式中运行import mmmm的时候,就首先在codes这个目录中搜索相应的文件(找到.py之后编译成为.pyc)。当然,后面在网页编程中,看官会看到,所谓主目录是可以通过顶层文件设置的目录。PYTHONPATH目录。这是一个环境变量设置,如果没有设置则滤去。如何进行环境变量设置,请看官google啦。标准库目录。已经随着Python的安装进入到计算机中的那个。任何.pth文件的内容。如果有这类文件,最后要在这类文件中搜索一下。这是一个简单的方法,在.pth文件中,加入有效目录,使之成为搜索路径。下图就是我的计算机上,存放.pth文件的位置以及里面放着的.pth文件

跟老齐学Python之模块的加载

看官也可以自己编写.pth文件,里面是有关搜索目录,保存到这里。比如,打开目录中的easy-install.pth文件,发现的内容:

跟老齐学Python之模块的加载

搜索就是这么一个过程。这里建议看官了解即可,不一定非要进行什么设置,在很多情况下,python都是会自动完成的。特别是初学者,暂且不要轻举妄动。

重载模块

以mmmm模块为例(在这里要特别提醒看官:我这样命名是相当不好滴,只不过是为了恶搞才这样命名的)。

在一个shell里面,运行了python,并且做了如下操作:

>>> import mmmm
>>> mmmm.web
'https://qiwsir.github.io'

下面我再打开一个shell,编辑mmmm.py这个文件,进行适当修改:

跟老齐学Python之模块的加载

保存之后,切换到原来的那个导入了模块的交互模式:

>>> mmmm.web
'https://qiwsir.github.io'

输出的跟前面的一样,没有任何变化,这是为什么呢?

原来,当导入模块的时候,只会在第一次导入时加载和执行模块代码,之后就不会重新加载或重新执行了,如果模块代码修改了,但是这里执行的还是修改之前的。

怎么实现代码修改之后,执行新的呢?一种方式就是退出原来的交互模式,再重新进入,再import mmmm。呵呵,这种方法有点麻烦。Python提供了另外一个函数——reload函数,能够实现模块的重新加载(简称重载),重载后模块代码重新执行。如下继续:

>>> reload(mmmm)
<module 'mmmm' from 'mmmm.py'>
>>> mmmm.web
'https://qiwsir.github.io, I am writing a python book on line.'

这下就显示修改之后的内容了。

特别提醒注意:

reload是内置函数reload(module),module是一个已经存在的模块,不是变量名。

Python 相关文章推荐
python 控制语句
Nov 03 Python
python单例模式实例分析
Apr 08 Python
Python中字典的基础知识归纳小结
Aug 19 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
导入tensorflow时报错:cannot import name 'abs'的解决
Oct 10 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
Python操作Excel把数据分给sheet
May 20 Python
python和shell实现的校验IP地址合法性脚本分享
Oct 23 #Python
探寻python多线程ctrl+c退出问题解决方案
Oct 23 #Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 #Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 #Python
使用Python开发windows GUI程序入门实例
Oct 23 #Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 #Python
python文件操作整理汇总
Oct 21 #Python
You might like
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
VUE重点问题总结
2018/03/19 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
python简单的函数定义和用法实例
2015/05/07 Python
彻底搞懂Python字符编码
2018/01/23 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
python 读取修改pcap包的例子
2019/07/23 Python
python常用排序算法的实现代码
2019/11/08 Python
python实现滑雪者小游戏
2020/02/22 Python
Internal修饰符有什么含义
2013/07/10 面试题
教师找工作推荐信
2013/11/23 职场文书
给实习单位的感谢信
2014/02/01 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
2015年见习期工作总结
2014/12/12 职场文书
骨干教师个人总结
2015/02/11 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书