python Reload的准备知识

最近要做游戏开发的脚本reload,发现有很多问题需要理解,索性看看python的import reload的原理都给看看吧!

  • import说明

  import做了三件事情:

  1.创建了一个namespace,包含了对应的源代码文件中的所有objects。在该文件中所有fuction和method(关于method和function可参考下面)用到的global表达式都从该namespace中查找对象。

  2.执行在新的namespace中的可执行代码

  3.创建一个指向该module namespace对象的引用。

  因此需要注意,如果module中除了定义variable,function和class之外还执行了一些计算和打印操作的话,这些都会在import时执行,因此,尽量不要有太多耗时的code在module中。

  使用import...as xx,xx作为namespace的引用只在当前上下文有效。并且module只会load和excute一次,多次import其实只是重新将namespcae绑定到了xx上。

  • from ...import

  from与import不同的是,只是将指定namespace的定义好的object,创建了一个在当前namespace的引用。其实这就可以解释为啥reload(amodule)时,那么from a import xx,这些不能更改的问题了。

  另外,from xx import * 只能用在module的开头部分,因为python fuction scoping rules,所有fuction在编译成internal bytecode时,所有在funciton body中的symbol必须是确定的。

  由于python的引用机制,不能使用类似c/c++的global 参数来传值。

  比如

  

  如果foo中打印了a的值,那么打印的是spam中a的值,同时,本文件的a是一个指向42的引用,并不会修改spam中a的值。

  • Module Search Path

  sys.path中记录了解释器的寻找路径list。list可以包含目录、zip和zgg files。zip和zgg文件通常都是一种将多个modules打包成一个文件,方便使用。

  比如可以将foo.py和bar.py打包到xx.zip,然后加入到sys.path中后,直接import foo,bar即可。

  比如: import sys

     sys.path.append(‘xx.zip)

     import foo,bar

  并且可以sys.path.append(‘xx.zip/tmp/python‘)实现zip文件子目录的添加。

  egg file是zip file的升级,添加了一些metadata而已。

  注意到,archive只能import py、pyw、pyc、pyo,shared library和c写的module是不可以通过archive添加的。并且通过archive方式添加的py文件,并不会生成pyc文件,影响效率。

  • Module Loading and Compilation

  import 的module可以归为如下4中类型:

  1. .py files; 2. C/C++ extension,并且编译成了 share library或dlls; 3. 包含多个modules的package; 4. 解释器内嵌的modules

  当寻找一个module,如foo时,interpreter按sys.path中的顺序依次寻找其中的每一个路径,其中每个路径中按如下顺序寻找文件:

  

  最后上面都没有找到,才会去检查是否匹配built-in module name。

  • reload

  这点太坑爹,之前一直说python可以hotfix,其实python自身对这些的支持是很少的,大多数比较成熟的方案都是各位大神们workaround的方法...

  原因在于,尽管可以从sys.modules中remove a module,但是module并不会真实从内存中删除,因为程序的其他模块可能import了这个module。另外如果这些module中定义了

  class并存在instances,instance保存了这些class object,反过来也会保存module的引用。

  另外,已经创建的instance如何通过import和unimport来实现其中内容的更新,更是值得思考的方式。

  

  大致今天花了1个半小时看了这些,明天有空把看到的hotfix的两种实现方法给总结一下。

时间: 2024-11-06 12:15:38

python Reload的准备知识的相关文章

Python网络爬虫基础知识学习

对Python有一些简单了解的朋友都知识Python编程语言有个很强大的功能,那就是Python网络爬虫(http://www.maiziedu.com/course/python/645-9570/),一提到Python,就会想到相关的Python爬虫和scrapy等等,今天就来简单认识学习Python爬虫的基础知识,有了一定的相关爬虫知识,以后学习scrapy.urllib等等知识时,会相对轻松些. 爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组

Python reload(sys)找不到,name 'reload' is not defined

sys.setdefaultencoding("utf-8") 这种方式在3.x中被彻底遗弃,可以看看stackover的这篇文章: http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script Python reload(sys)找不到,name 'reload' is not defined

python reload(sys)找不到,name 'reload' is not defined和Python3异常-AttributeError: module 'sys' has no att

基于python3.6.1版本,在一个.py文件中,加入这3行:import requests, re, sysreload(sys)sys.setdefaultencoding("utf-8") 出现这样的错误:sys.setdefaultencoding("utf-8")AttributeError: module 'sys' has no attribute 'setdefaultencoding' 原因分析:Python3字符串默认编码unicode, 所以

python的一些基础知识1(共计10)

python现在很热门,我们公司是一个教育机构也对这个很热门的东西情有独钟,我打算从今天开始用十节课的内容给大家讲解一下pathon的基础知识. 首先需要记住一些必备的尝试: 1:退出python交互式解释器的快捷键是CTRL+D 2:如果熟悉其他计算机语言,可能习惯性的在每行后以分号结束,python则不用,一行就是一行,不管多少,如果喜欢的话可以加上分号,但是不会起到任何作用. 3:在python中参与出发运算的两个数如果有一个是浮点数则运算结果就是浮点数,两个数如果都是整数则运算结果也为整

python类的相关知识第二部分

类的继承.多态.封装 一.类的继承 1.应用场景: 类大部分功能相同,大类包含小类的情况 例如: 动物类 共性:都要吃喝拉撒.都有头有脚 特性: 猫类.走了很轻,叫声特别,喜欢白天睡觉 狗类.的叫声很大,晚上睡觉 2.继承顺序 在python2版本中多重继承有分两种继承循序 (1).一直往上找 .找到最高级的父类再重另外一个分支找,直到找到为止. (2).一直往上找,找到最高级父类的下一层后就不找了.从另外一个分支找,另外一个分支没找到最后才找最高级的父类. 再python3中只有第一种继承循序

python相关的基础知识分享

今日面试,,才发现lambda和fibonacci都忘了怎么写,一年半载没有频繁的用py,以往的兴趣因生活的忙碌而显得生疏了,还好,之前学习整理的文档都放在了网站上,以备查验. 分享出来解决方案: http://www.pcswo.com/static/file/python/basis/function/generator-eg.py >>> m = lambda x,y,z: (x-y)*z >>> print(m(3,1,2)) 4 >>> de

Python 浮点数的冷知识

本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家. 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b,那么相同索引的元素(如 a[0] .b[0])是否必然相等呢? 若两个对象的 hash 结果相等,即 hash(a) == hash(b),那么它们是否必然相等呢? 答案当然都为否(不然就不叫冷知识了),大家可以先尝试回答一下,然后再往下看. -----思考分割线----- 好了,先来看看第一个问

python的list相关知识

关于list的相关知识 list01 = ['alex',12,65,'xiaodong',100,'chen',5] list02 = [67,7,'jinjiao_dawang','relax1949',53] #打印list01.list02 print(list01) print(list02) #列表截取.切片 print(list01[1]) print(list01[-2]) print(list01[1:3]) #列表重复 print(list01 * 3) #列表组合 prin

Python基础之小知识要点

1.python注释. python备注分为单行和多行注释,单行注释为#,多行注释为三个单引号或三个双引号. 2.python文件格式及页面编码. 2.1一般通过python IDLE( shell)创建的文件,文件保存时的格式编码为utf-8格式,如果是通过记事本创建的,请记得文件保存时的格式编码要选择为utf-8. 2.2一般.py文件免不了会出现中文,但是为了页面不出现乱码,需要在文件内容头部加上:#coding=utf-8,将代码编码设置为utf-8, 3.python缩行. pytho