Python模块的加载讲解

作者:hiekay 时间:2023-04-05 08:42:01 

不管是用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是一个已经存在的模块,不是变量名。

来源:https://blog.csdn.net/u010820857/article/details/85338713

标签:python,模块
0
投稿

猜你喜欢

  • Go语言中的UTF-8实现

    2024-04-25 15:30:51
  • Python 25行代码实现的RSA算法详解

    2023-04-06 17:05:58
  • golang定时器Timer的用法和实现原理解析

    2024-02-17 04:23:08
  • MySQL数据库事务隔离级别介绍(Transaction Isolation Level)

    2024-01-18 05:54:11
  • 微信小程序:报错(in promise) MiniProgramError

    2024-05-09 10:35:18
  • vue嵌套组件传参实例分享

    2024-06-07 15:23:11
  • JavaScript实现省市县三级级联特效

    2024-04-18 10:55:56
  • python实现微信小程序的多种支付方式

    2021-03-26 21:38:58
  • HTML5 WebSockets基础使用教程

    2010-09-21 12:48:00
  • Python 实现Mac 屏幕截图详解

    2021-06-16 13:43:52
  • numpy数组坐标轴问题解决

    2022-10-23 02:48:12
  • DreamWeaver经典技巧四则

    2007-12-03 11:34:00
  • Django启动时找不到mysqlclient问题解决方案

    2024-01-17 15:55:29
  • 使用python计算方差方式——pandas.series.std()

    2022-05-24 14:03:35
  • python try except 捕获所有异常的实例

    2023-03-22 18:49:50
  • python实现维吉尼亚算法

    2023-07-02 01:28:17
  • python获取指定字符串中重复模式最高的字符串方法

    2021-03-25 14:59:25
  • 基于ExtJs框架的B/S高级查询界面

    2008-10-07 18:05:00
  • python变量赋值方法(可变与不可变)

    2021-02-14 08:51:55
  • Python 把序列转换为元组的函数tuple方法

    2022-11-11 15:06:58
  • asp之家 网络编程 m.aspxhome.com