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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
python切换hosts文件代码示例
Dec 31 Python
Python回调函数用法实例详解
Jul 02 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
Python与R语言的简要对比
Nov 14 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
PyQt5组件读取参数的实例
Jun 25 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
对Django的restful用法详解(自带的增删改查)
Aug 28 Python
python正则表达式匹配IP代码实例
Dec 28 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 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常用的文件操作函数经典收藏
2013/04/02 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
PHP防止跨域提交表单
2013/11/01 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
Python 正则表达式操作指南
2009/05/04 Python
Python中的异常处理学习笔记
2015/01/28 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
do you have any Best Practice for testing
2016/06/04 面试题
大家检讨书5000字
2014/02/03 职场文书
授权委托书格式范文
2014/08/02 职场文书
公司授权委托书格式样本
2014/10/01 职场文书