百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python代码是如何执行的?(python代码执行顺序)

off999 2024-10-05 19:45 21 浏览 0 评论

解释运行程序

回忆上次内容

  • py 文件的程序是按照顺序
    • 一行行挨排解释执行的
    • 我们可以 python3 -m pdb hello.py 来对程序调试
    • 调试的目的是去除 bug
    • 别害怕 bug
    • bug 会有提示
    • 我们也就知道如何 debug 调试
  • 顺序执行
    • 程序在文本中从上到下是一行行写的
    • 调试的时候也是从头到尾一行行执行的
    • 但是执行的时候是如何把代码一行行解释执行的呢?
  • 说到底 python3 到底是个啥呢?
    • python3 又是怎么解释 hello.py 的?
    • 这两这节课相当复杂
    • 如果感觉太过复杂
    • 可以直接跳过
    • 不影响后面的理解
  • 我们先要看看python3对Guido.py做了些什么???

tokenize

  • 首先把字符分组成词
  • 词法分析(lexical analysis)中
  • 把原来的字符流
  • 变成了词的流
    • token(令牌)流
  • 词法分析之后输出的是一个token流
  • 什么是token流呢?
    • 首先要知道什么是token

token

  • token
    • 令牌
  • 古人说听我号令
    • 号指的是号角
    • 令指的是令牌
      • 急急如律令
      • 令行禁止
  • 怎么把源文件变成一个token流呢?

python3模块

  • 这个东西是python3的一个模块
  • 具体怎么运行呢?

token流

  • 我们尝试运行
    • python3 -m tokenize guido.py
    • 对guido.py进行词法分析
  • 分析出来的词(token)流长什么样子呢?
  • 这个词怎么理解呢?

token流

  • 第0行设置了编码格式
  • 第1行[0,5)字符是第1行第1个token
    • print
    • print是一个Name(名字)
  • 第1行[5,6)字符是第1行第2个token
    • (
    • (是一个Operator(操作符)
  • 第1行[6,30)字符是第1行第3个token
    • "1982------Guido in cwi"
    • 这是一个String(字符串)
  • 第1行[30,31)字符是第1行第4个token
    • )
    • )是一个Operator(操作符)
  • 第1行[31,32)字符是第1行第5个token
    • \n
    • \n是一个NewLine(换行符)
    • 换行符意味着第一行结束
  • 第2行...
  • 词分析出来之后呢?

组词

  • 词分析出来就是怎么组词的问题
    • 哪些词和哪些词先组合
    • 哪些词和哪些词后组合
  • 生成一棵抽象语法树
    • AST(Abstract Syntax Tree)
  • 具体怎么生成这棵ast树呢?

引入ast模块

  • 具体怎么做呢?

流程

  • 先把这个ast模块导入(import)进来
  • 然后读取guido.py并送到s
  • 然后对于s进行语法分析(parse)
  • 不过这乱七八糟堆一起怎么理解呢?

缩进换行

  • 把分析的结果进行dump(转储)
  • 目前lanqiao.cn上面的python是3.8
  • 这个换行需要在3.9以上完成
  • 只能在本地演示一下

缩进演示

  • 这个就是把词组成语法树的样子
  • 但是语法树还不能直接执行
  • 什么才能直接执行呢?

翻译成字节码

  • 字节码(指令)才能真正执行
  • 怎么把ast转化为字节码(指令)呢?
  • 需要编译
  • 从一种语言到另一种语言
    • 从py文件
    • 到字节码(指令)
  • 我可以看看这个编译过程么?

compile

  • 这个东西完全是乱码
  • 我看不懂啊?
  • vi打开这个这个pyc文件

二进制形态

  • :set wrap设置换行
  • 可以看到他的二进制形态么?

二进制

  • :%!xxd
    • 把文件转化为二进制
  • 实在是看不懂啊
  • 能把这个字节码(指令)变成我们人能看懂的么?

反编译

  • disassembler这个词由两部分组成
    • dis (反着来的)
    • assembler (汇编语言)
  • 整体就是
    • 把py源文件编译成的字节码(指令)
    • 反编译(disassembler)成这些字节码对应的助记符(指令的含义)
  • 这可以用么?
  • 去试试!

反编译(dis)

  • python3 -m dis guido.py
  • 我们可以看见
    • 前面是行号
    • 每行对应4条指令
      • LOAD_NAME 装载函数名
      • LOAD_CONST 装载参数
      • CALL_FUNCTION 调用函数
      • POP_TOP 弹栈返回
    • 每条指令对应一个字节码
  • 那具体这个LOAD_NAME是什么意思呢?

指令

  • 指令对应着一个字节码状态
  • 但是LOAD_NAME这条指令
  • 具体对应什么二进制字节状态呢?

二进制状态

  • 我们找找程序中的4条指令对应的字节状态

4条指令

指令助记符

指令含义

十进制状态

十六进制状态

LOAD_NAME

装载函数名称

101

0x65

LOAD_CONST

装载参数

100

0x64

CALL_FUNCTION

调用函数

142

0x8e

POP_TOP

弹栈返回

1

0x01

  • 可以找到源代码的对应关系么?
  • 好像找到了
  • 但是0x83 对应的是 GET_AWAITABLE
  • 显然00 83是从表中的0号位置取得字符串变量
  • 01 83是从表中的1号位置取字符串
  • 以此类推,直到05 83
  • 那这些代码究竟是什么指令集的呢?
    • 龙芯
    • intel
    • 还是arm呢?

虚拟机的虚拟cpu

  • 这些字节码(bytecode)对应的是python虚拟机上面虚拟cpu的指令集
  • 怎么还有虚拟机
  • 虚拟cpu呢?
  • 我们先把这节课总结一下

总结

  • 我们把python源文件
    • 词法分析 得到 词流(token stream)
    • 语法分析 得到 抽象语法树(Abstract Syntax Tree)
    • 编译 得到 字节码 (bytecode)
    • 反编译 得到 指令文件
  • 不过这个指令文件是基于虚拟机的虚拟cpu的指令集
  • 怎么这么虚呢?
  • 我们下次再说

本文章来自于《oeasy教您玩转python》(https://www.lanqiao.cn/courses/3584)中第6个实验。

相关推荐

python爬取电子课本,送给居家上课的孩子们

在这个全民抗疫的日子,中小学生们也开启了居家上网课的生活。很多没借到书的孩子,不得不在网上看电子课本,有的电子课本是老师发的网络链接,每次打开网页去看,既费流量,也不方便。今天我们就利用python的...

高效办公!Python 批量生成PDF文档是如何做到的?

前言:日常办公中,经常会使用PDF文档,难免需要对PDF文档进行编辑,有时候PDF文档中的大部分内容都是一样的,只是发送对象不同。这种模板套用的场景下,使用Python进行自动化就尤为方便,用最短的时...

如何用Python将PDF完整的转成Word?

PDF文件完整的转为Word,转换后格式排版不会乱,图片等信息完整显示不丢失。这个很简单,有很多方法都可以实现。方法一:Python利用Python将PDF文件转换为Word,有许多库可以帮你实现这一...

使用Python拆分、合并PDF(python合并多个pdf)

知识点使用Python操作PDF!主要内容有:1、PDF拆分;2、PDF合并。在工作中,难免会和PDF打交道,所以掌握一点处理PDF的技能非常有必要,本文将介绍几个常用的功能。PDF拆分很多时候,获取...

10分钟实现PDF转Word神器!看DeepSeek如何用Python解放打工人

开篇痛点每个被PDF折磨过的职场人都懂——领导发来的扫描件要修改,手动抄到Word需要2小时;网上下载的报告想复制数据,却变成乱码…今天我们用Python+DeepSeek,10分钟打造一个智能转换工...

《Python知识手册》,高清全彩pdf版开放下载

Python编程还不懂?今天我要把我参与编写的这套《Python知识手册》免费分享出来,看完文末有惊喜哦。...

利用python进行数据分析,PDF文档给你答案

本书详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。虽然本书的标题是“数据分析”,重点却是Python编程、库,以及用于数据分析的工具。兄弟,毫无套路!PDF版无偿获...

OCRmypdf:一款可以让扫描PDF文件变得可搜索、可复制!

简介在日常工作中,我们经常会接触到各种PDF文件,其中不少是扫描版文档。处理这些扫描PDF时,尽管内容看似完整,但往往无法直接复制或搜索其中的文本。尤其是在需要对大量文档进行文本分析、存档或后期编辑时...

高效的OCR处理工具!让扫描PDF文件变得可搜索、可复制!

在工作中,我们常常遇到各种各样的PDF文件,其中不乏一些扫描版的文档。而在处理扫描的PDF文件时,虽然文件内容看似完整,但你却无法复制、搜索其中的文本。特别是对大量文档需要进行文本分析、存档、或者...

三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!

面对100页以上的大型PDF文件时,阅读和搜索往往效率低下。传统关系型数据库在处理此类数据时容易遇到性能瓶颈,而Elasticsearch凭借其强大的全文检索和分布式架构,成为理想解决方案。通过...

用 Python 去除 PDF 水印,你学会吗?

今天介绍下用Python去除PDF(图片)的水印。思路很简单,代码也很简洁。首先来考虑Python如何去除图片的水印,然后再将思路复用到PDF上面。这张图片是前几天整理《数据结构和算法...

扫描PDF档案效率提升300%!OCRmyPDF:告别无法搜索的PDF噩梦,这款26K Star的开源神器让文本识别轻松上手!

要在PDF中搜索某个关键词,结果发现啥也找不到?这种情况大多数人都遇到过吧,特别是处理扫描文档或图片PDF时。就在前几天,我还在为这事抓狂呢!后来无意中发现了OCRmyPDF这个宝藏项目...简直就...

Python自动化办公之PDF版本发票识别并提取关键信息教程(上篇)

大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公发票数据处理的问题,一起来看看吧。二、实现过程这个问题在实际工作中还是非常常见的,实用性和通用性都比...

PDF解锁神器:用PyMuPDF与pdfplumber告别手动提取

前言大家好,今天咱们来聊聊如何用Python中的PyMuPDF和pdfplumber库,轻松提取PDF文件里的文本和元数据。你是否曾经在处理一个复杂的PDF文件时,感到信息难以触及,提取过程让人抓狂?...

《Python知识手册》,高清pdf免费获取

今天我要把我参与编写的这套《Python知识手册》免费分享出来,真正弘扬Python开源精神!手册的部分页面如下:获取方式:...

取消回复欢迎 发表评论: