python模块导入原理
转自:http://blog.csdn.net/u012422440/article/details/41791433
今日在自学Python,借此机会,正好重新开始写博文,既可以巩固python的知识,也可顺便提高一下文笔。
一、python模块基础
言归正传,Python的模块是python语言中代码复用的最高级别,也是系统命名空间的的划分标准,也是供顶层文件(就是包含程序主要控制流程的部分)调用的工具库文件。实现模型其实很简单,任何一个python文件都可以当做模型通过import进行导入。而python的import与c或者c++的include的原理并不相同,举个例子就是:
a.py:
- message="test"
- def printer():
- print("test")
b.py:
- import a
- a.printer()
通过import 就是可以让b.py文件的顶层可以通过变量名b来获得所有的b.py在顶层定义的所有对象,比如message,printer。
二、import工作原理
之前提到python的import并不等同与c或者c++的include,因为import并不是把一个文件文本直接插入到另外一个文件中而已,在编译时进行;import其实是运行时的运算。
在程序第一次导入指定文件时,会执行三个步骤:
1.找到模块文件。
注意两点,1 导入时不需要加上文件的路径 2 导入时不需要加上文件的后缀名。
模块搜索路径:
*程序主目录
*PYTHONPATH目录
*标准链接库目录
*.pth文件目录
前三个估计大家都很了解,第四个是指python运行用户把有效的路径添加到模块搜索路径中去,也就是在.pth文件中一行一行的列出来。
2.编译成字节码(如果必要时)。
如果导入的文件并没有被编译成字节码,python会将起进行解释,如果已经存在.pyc的文件,python会检查字节码的时间戳,如果比源码的时间戳旧,程序运行时便会从新编译成为新的字节码,否则跳过编译过程。
3.执行模块的代码来创建其所定义的对象。
程序会讲导入的文件从头到尾执行一遍,在此过程中任何对变量名进行的赋值操作,都会产生得到的模块文件的属性,但是要注意这些对变量名的赋值操作必须是在模块文件的顶层进行的操作,例如使用def语句来定义函数,模块文件中便会添加这个定义的函数属性。
三、import,from,reload
import使一个变量名引用整个模块对象,我们可以通过模块名来得到或者使用该模块的属性;而from语句是将变量名复制到另一个作用域,我们可以在脚本重直接使用复制后的变量名。
需要注意的问题是导入只会发生一次,当第二次导入时,程序不会执行import工作原理中的三个步骤,而是从python内部模块表中取出已经创建的模块对象。
reload则可以从新导入模块,实现在不中断程序的前提下,重新执行import工作原理中所说的三个步骤,导入模块。reload会在模块当前的命名空间内执行模块文件的新的代码,让导入模块文件重顶层语句执行来对变量名进行从新赋值。reload会影响所有的import语句,而只会对之后使用的from语句有影响,也就是说,对于在reload之前使用from语句复制获得变量是不受reload影响的。
python模块导入原理的更多相关文章
- 一文解决python模块导入
python 模块导入 原理 查找是按照 sys.path 中的路径挨个扫描.若都不存在则提示error. sys.path路径第一个是当前运行脚本所在的目录,其后是PYTHONPATH(一般若步专门 ...
- python模块导入细节
python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: ...
- 【转】python模块导入细节
[转]python模块导入细节 python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码 ...
- 详解Python模块导入方法
python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...
- python模块导入总结
python模块导入总结 模块导入方式 定义test.py模块 def print_func(): print("hello") import 语句 导入模块语法 import m ...
- python 模块导入import和import from区别
模块就是一个.py文件,在名字空间下导入模块导入import和import from,那么python 模块导入import和import from区别是什么呢 1,import 导入模块 impor ...
- python 模块导入
1. 模块导入: 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导 ...
- python模块导入
官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: 用于执行的可执行程序文件 ...
- python 模块导入详解
本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念.通常,导入模块都是使用如下语句: import ... import ... as ... from .. ...
随机推荐
- 五个问题,三大策略,手把手教你定制App性能监控方案
作者:友盟+U-APM团队 Why? 为什么要做应用性能监控? 首先,我们要知道应用性能监控具体指什么?以及目的: 监控是一套完整的"监视+报警"的系统.对于像我们这样的App开发 ...
- 冒泡算法(BubbleSort)
/*冒泡排序原理 比较相邻的元素.如果前一个元素比后一个元素大,就交换这两个元素的位置. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素.最终最后位置的元素就是最大值.实现步骤 1 ...
- [矩阵乘法]裴波拉契数列III
[ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I I I [矩阵乘法]裴波拉契数列III [矩阵乘法]裴波拉契数列III Description 求数列f[n]=f[n-1]+f[n-2]+1的第N ...
- 翻译:《实用的Python编程》08_03_Debugging
目录 | 上一节 (8.2 日志) | 下一节 (9 包) 8.3 调试 调试建议 假设程序崩溃了: bash % python3 blah.py Traceback (most recent cal ...
- MyBatis笔记(三)
1. ResultMap 查询结果为null:要解决属性和字段名不一致的问题 我们先来看下步骤: 数据库中的字段名 Java中的实体类 public class User { private i ...
- Windows系统搭建ELK日志收集服务器
一.ELK是什么?ELK是由Elasticsearch.Logstash.Kibana这3个软件的首字母缩写. Elasticsearch是一个分布式搜索分析引擎,稳定.可水平扩展.易于管理是它的主要 ...
- 创建逻辑卷,格式化为xfs格式化,在线扩容
创建逻辑卷,并且格式化为xfs格式化好,然后在线扩容 删除逻辑卷组
- Day07_34_集合概述
集合概述 * 主要集合概述 - 集合相当于现实世界中的容器,主要包含两种存放模式,一个一个的存(Collection), 一对一对存(Map[key,value]) - 集合中只能存储引用数据类型,不 ...
- 数据结构(3):java使用数组模拟堆栈
堆栈原理: 数组模拟堆栈: //数组模拟栈 class ArrayStack{ //栈顶 private int top = -1; private int maxSize; private int[ ...
- 模拟退火算法(1)Python 实现
1.模拟退火算法 模拟退火算法借鉴了统计物理学的思想,是一种简单.通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用. 退火是金属从熔融状态缓慢冷却.最终达到能 ...