Python模块的加载讲解


Posted in Python onJanuary 15, 2019

不管是用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的模块。怎么找到,后面讲述。
  • 编译。找到模块文件之后,将其编译成字节码,就是那个.pyc文件里面的(关于字节码,下面会介绍,请继续阅读)。注意,不是什么时候都编译的,只有第一次运行时候才编译,如果mmmm.py文件改变了,相当于又一个新文件,也会从新编译。其实就是.pyc文件中有一个时间戳,python会自动检查这个时间戳,如果它比同名的.py文件时间戳旧,就会从新编译。否则跳过。当然,如果根本就没有找到同名的.py源文件,只有字节码文件.pyc,那么就只能运行这个了。
  • 运行。执行就是前面已经编译的模块字节码文件,顺理成章要执行了。

搜索模块

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

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

Python模块的加载讲解

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

Python模块的加载讲解

搜索就是这么一个过程。这里建议了解即可,不一定非要进行什么设置,在很多情况下,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. '

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

特别提醒注意:

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
python僵尸进程产生的原因
Jul 21 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
python groupby 函数 as_index详解
Dec 16 Python
Django 批量插入数据的实现方法
Jan 12 Python
Python计算指定日期是今年的第几天(三种方法)
Mar 26 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
matplotlib阶梯图的实现(step())
Mar 02 Python
常用的Python代码调试工具总结
Jun 23 Python
Python实现网站表单提交和模板
Jan 15 #Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 #Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 #Python
Python3中lambda表达式与函数式编程讲解
Jan 14 #Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 #Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 #Python
python 根据时间来生成唯一的字符串方法
Jan 14 #Python
You might like
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
js模拟类继承小例子
2010/07/17 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
Javascript的闭包详解
2014/12/26 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
JS+DIV实现拖动效果
2020/02/11 Javascript
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
简述python Scrapy框架
2020/08/17 Python
Django nginx配置实现过程详解
2020/09/10 Python
用python制作个视频下载器
2021/02/01 Python
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
报关简历自我评价怎么写
2013/09/19 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
时尚女魔头观后感
2015/06/04 职场文书
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电