资讯专栏INFORMATION COLUMN

[零基础学python]模块的加载

tinylcy / 2300人阅读

摘要:找到模块文件之后,将其编译成字节码,就是那个文件里面的关于字节码,下面会介绍,请继续阅读。当然,如果根本就没有找到同名的源文件,只有字节码文件,那么就只能运行这个了。执行就是前面已经编译的模块字节码文件,顺理成章要执行了。

不管是用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文件

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

搜索就是这么一个过程。这里建议看官了解即可,不一定非要进行什么设置,在很多情况下,python都是会自动完成的。特别是初学者,暂且不要轻举妄动。

重载模块

以mmmm模块为例(在这里要特别提醒看官:我这样命名是相当不好滴,只不过是为了恶搞才这样命名的)。

在一个shell里面,运行了python,并且做了如下操作:

>>> import mmmm
>>> mmmm.web
"https://qiwsir.github.io"

下面我再打开一个shell,编辑mmmm.py这个文件,进行适当修改:

保存之后,切换到原来的那个导入了模块的交互模式:

>>> mmmm.web
"https://qiwsir.github.io"

输出的跟前面的一样,没有任何变化,这是为什么呢?

原来,当导入模块的时候,只会在第一次导入时加载和执行模块代码,之后就不会重新加载或重新执行了,如果模块代码修改了,但是这里执行的还是修改之前的。

怎么实现代码修改之后,执行新的呢?一种方式就是退出原来的交互模式,再重新进入,再import mmmm。呵呵,这种方法有点麻烦。Python提供了另外一个函数——reload函数,能够实现模块的重新加载(简称重载),重载后模块代码重新执行。如下继续:

>>> reload(mmmm)

>>> mmmm.web
"https://qiwsir.github.io, I am writing a python book on line."

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

特别提醒注意:

reload是内置函数

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37409.html

相关文章

  • Python从入门到转行

    摘要:学了大半年之后成功转行做前端了。包含大量其他神经网络库中的包装器和抽象,其中最值得注意的是,其中也包含一些机器学习的实用模块。它是轻量级可扩展的神经网络工具包,同时拥有友好的界面,可供机器学习的训练和预测使用。 题记:大二的时候发现人生苦短,所以信了拍神,开始学Python。学了大半年之后成功转行做前端了。来写个教程帮助大家入门Python。 Python零基础入门 零基础入门就得从最...

    ingood 评论0 收藏0
  • [基础python]啰嗦除法

    摘要:补充一个资料,供有兴趣的朋友阅读浮点数算法争议和限制说明以上除法规则,是针对,在中,将和等同起来了。比如下面的例子不啰嗦了,实验一个注意了,引用了一个模块之后,再做除法,就不管什么情况,都是得到浮点数的结果了。 除法啰嗦的,不仅是python。 整数除以整数 看官请在启动idle之后,练习下面的运算: >>> 2/5 0 >>> 2.0/5 0.4 >>> 2/5.0 0.4 >...

    james 评论0 收藏0
  • [基础python]Import 模块

    摘要:认识模块对于模块,在前面的一些举例中,已经涉及到了,比如曾经有过获取随机数模块。这张图列出了很少一部分存在这个目录中的模块文件。的标准库是的一个组成部分,也是为的利器,可以让编程事半功倍。这就是基本的模块方法。 认识模块 对于模块,在前面的一些举例中,已经涉及到了,比如曾经有过:import random (获取随机数模块)。为了能够对模块有一个清晰的了解,首先要看看什么模块,这里选...

    yankeys 评论0 收藏0
  • [基础python]Hello,第一个网页分析

    摘要:的非阻塞单线程的特点在这个模块中体现。还有一个模块引入,是用完成的这两句就显示了所谓命令行解析模块的用途了。表示可以接收来自的请求了。以上把一个简单的剖析。 As he walked by the sea of Galilee, he saw two brothers, Simon, who is called Peter, and Andrew his brother, cas...

    Steve_Wang_ 评论0 收藏0

发表评论

0条评论

tinylcy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<