跟老齐学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中的MongoDB基本操作:连接、查询实例
Feb 13 Python
在Python中处理字符串之ljust()方法的使用简介
May 19 Python
python函数局部变量用法实例分析
Aug 04 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
python安装scipy的步骤解析
Sep 28 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
python导入库的具体方法
Jun 18 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
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
Python查找相似单词的方法
2015/03/05 Python
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
城管大队整治方案
2014/05/06 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python