跟老齐学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加密自己的密码
Aug 04 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
有趣的python小程序分享
Dec 05 Python
python入门:这篇文章带你直接学会python
Sep 14 Python
Python3模拟登录操作实例分析
Mar 12 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
python多次执行绘制条形图
Apr 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
PHP 简单数组排序实现代码
2009/08/05 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
php中动态调用函数的方法
2015/03/16 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
Js的MessageBox
2006/12/03 Javascript
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
js的with语句使用方法
2007/09/21 Javascript
给Function做的OOP扩展
2009/05/07 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
理解JS绑定事件
2016/01/19 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
仓库主管的岗位职责
2013/12/04 职场文书
质检员岗位职责
2013/12/17 职场文书
业务部主管岗位职责
2014/01/29 职场文书
请假条格式范文
2014/04/10 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
给下属加薪申请报告
2015/05/15 职场文书