Python程序运行原理图文解析


Posted in Python onFebruary 10, 2018

本文研究的主要是Python程序运行原理,具体介绍如下。

编译型语言(C语言为例)

Python程序运行原理图文解析

动态型语言

Python程序运行原理图文解析

一个程序是如何运行起来的?比如下面的代码

#othermodule.py
def add(a, b):
  return a + b

#mainrun.py

import othermodule

a = ['xiaoke', 1, 'python']
a = 'xiaoke string'

def func():
  a = -5
  b = 257 
  print(a + b)

print(a)

if __name__ == '__main__':
  func()
  res = othermodule.add(1, 2)
  print(res)

分析

Python程序运行原理图文解析

Python程序运行原理图文解析

dir 函数

Python 的内置函数 dir 可以用来查看一个命名空间下的所有名字符号。一个用处是查看一个命名空间的所有属性和方法(这里的命名空间就是指类、函数、module)。

比如,查看当前的命名空间,可以使用 dir(),查看 sys 模块,可以使用 dir(sys)

def 指令

def func(),在字节码指令中就是 MAKE_FUNCTION。
Python 是动态语言,def 实际上是执行一条指令,用来创建函数
(class 则是创建类的指令),而不仅仅是个语法关键字。
函数并不是事先创建好的,而是执行到的时候才创建的。

def func() 将会创建一个名称为 func 的函数对象。
实际上是先创建一个函数对象,然后将 func 这个名称符号绑定到这个函数上。

pyc文件

pyc 文件是 PyCodeObject 对象在硬盘上的表现形式。生成pyc文件:

python -m py_compile xx_module.py

pyc文件三大作用

  1. 创建时间,py文件比pyc文件新,则从新生成pyc
  2. magic num做运行前版本检测,版本不同从新生成pyc
  3. PyCodeObject 对象

在运行期间,编译结果也就是 PyCodeObject 对象,只会存在于内存中,而当这个模块的 Python 代码执行完后,就会将编译结果保存到了 pyc 文件中,这样下次就不用编译,直接加载到内存中。

这个 PyCodeObject 对象包含了 Python 源代码中的字符串,常量值,以及通过语法解析后编译生成的字节码指令。PyCodeObject 对象还会存储这些字节码指令与原始代码行号的对应关系,这样当出现异常时,就能指明位于哪一行的代码。

import 指令

import 指令是用来载入 module 的,如果需要,也会顺道做编译的事。但 import 指令,还会做一件重要的事情就是把 import 的那个 module 的代码执行一遍,这件事情很重要。
Python 是解释执行的,连函数都是执行的时候才创建的。如果不把那个 module 的代码执行一遍,那么 module 里面的函数都没法创建,更别提去调用这些函数了。

执行代码的另外一个重要作用,就是在这个 module 的命名空间中,创建模块内定义的函数和各种对象的符号名称(也就是变量名),并将其绑定到对象上,这样其他 module 才能通过变量名来引用这些对象。

Python 虚拟机还会将已经 import 过的 module 缓存起来,放到一个全局 module 集合 sys.modules 中。
这样做有一个好处,即如果程序的在另一个地方再次 import 这个模块,Python 虚拟机只需要将全局 module 集合中缓存的那个 module 对象返回即可。

总结

以上就是本文关于Python程序运行原理图文解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
深入Python解释器理解Python中的字节码
Apr 01 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
Python中实现三目运算的方法
Jun 21 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
Python实现的弹球小游戏示例
Aug 01 Python
Python分支结构(switch)操作简介
Jan 17 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
python多线程爬取西刺代理的示例代码
Jan 30 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 Python
Python迭代器和生成器定义与用法示例
Feb 10 #Python
Python中装饰器学习总结
Feb 10 #Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 #Python
Python中生成器和迭代器的区别详解
Feb 10 #Python
详解python中的线程
Feb 10 #Python
Odoo中如何生成唯一不重复的序列号详解
Feb 10 #Python
python TCP Socket的粘包和分包的处理详解
Feb 09 #Python
You might like
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
php实现留言板功能
2017/03/05 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
使用js实现数据格式化
2014/12/03 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
wxPython中文教程入门实例
2014/06/09 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
初入社会应届生求职信
2013/11/18 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
小学科学教学计划
2015/01/21 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
杨善洲电影观后感
2015/06/04 职场文书
德能勤绩工作总结
2015/08/11 职场文书