返回顶部
首页 > 资讯 > 后端开发 > Python >Python dis 模块初步使用
  • 422
分享到

Python dis 模块初步使用

模块Pythondis 2023-01-31 06:01:15 422人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

python 代码先被编译为字节码后,再由Python虚拟机来执行字节码, Python的字节码是一种类似汇编指令的中间语言, 一个Python语句会对应若干字节码指令,虚拟机一条一条执行字节码指令, 从而完成程序执行。 Python

python 代码先被编译为字节码后,再由Python虚拟机来执行字节码, Python的字节码是一种类似汇编指令的中间语言, 一个Python语句会对应若干字节码指令,虚拟机一条一条执行字节码指令, 从而完成程序执行。
Python dis 模块支持对Python代码进行反汇编, 生成字节码指令。
先来一小段代码:

In[6]: def test():
...         x = 1
...         if x < 3:
...             return "yes"
...         else:
...             return "no"
代码执行后会输出:

In[7]: import dis
In[8]: dis.dis(test)
  2           0 LOAD_CONST               1 (1)
              3 STORE_FAST               0 (x)

  3           6 LOAD_FAST                0 (x)
              9 LOAD_CONST               2 (3)
             12 COMPARE_OP               0 (<)
             15 POP_JUMP_IF_FALSE       22

  4          18 LOAD_CONST               3 ('yes')
             21 RETURN_VALUE        

  6     >>   22 LOAD_CONST               4 ('no')
             25 RETURN_VALUE        
             26 LOAD_CONST               0 (None)
             29 RETURN_VALUE        


以第一条指令为例, 第一列的数字(2)表示对应源代码的行数。第二列的数字是字节码的索引,指令LOAD_CONST在0位置。第三列是指令本身对应的人类可读的名字。第四列表示指令的参数。第5列则是计算后的实际参数。其中的“>>" 表示跳转的目标, 第4列的“22” 表明了跳转到索引为22的指令。




Python代码在编译过程中会生成CodeObject, CodeObject是在虚拟机中的抽象表示, 在Python C源码中表示为PyCodeObject, 而生成的.pyc 文件则是字节码在磁盘中的表现形式。

以Python代码为讲,test.__code__.co_code 表示test函数的字节码指令序列。
将此序列打印出来,

code = [ord(i) for i in list(test.__code__.co_code)]
print code
输出:

[100, 1, 0, 125, 0, 0, 124, 0, 0, 100, 2, 0, 107, 0, 0, 114, 22, 0, 100, 3, 0, 83, 100, 4, 0, 83, 100, 0, 0, 83]


对照dis输出的字节码指令, 以[100,1,0]序列为例。100表示在Python字节码定义中的索引,在python代码中,
 可以通过dis.opname[100]查看,即为LOAD_CONST。而后的两个字节表示指令的参数。而dis输出的字节码指令中,
第二列的字节码索引则是指当前指令在co_code序列中所在的位置。
dis输出的字节码指令中,部分指令是没有参数, 在co_code 中也同样可以看到,83(RETURN_VALUE)直接接上下一条指令100(LOAD_CONST)。















--结束END--

本文标题: Python dis 模块初步使用

本文链接: https://www.lsjlt.com/news/190045.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python dis 模块初步使用
    Python 代码先被编译为字节码后,再由Python虚拟机来执行字节码, Python的字节码是一种类似汇编指令的中间语言, 一个Python语句会对应若干字节码指令,虚拟机一条一条执行字节码指令, 从而完成程序执行。 Python ...
    99+
    2023-01-31
    模块 Python dis
  • Python使用dis模块把Python反编译为字节码的用法详解
    dis — Disassembler for Python bytecode,即把python代码反汇编为字节码指令. 使用超级简单: python -m dis xxx.py Python 代码是...
    99+
    2022-06-04
    字节 详解 模块
  • 使用Python模块:struct模块
    Python没有提供直接的将用户定义的数据类型和文件IO关联起来的功能,但是它提供了struct库(是一个内置库)——我们可以以二进制模式来写这些数据(有趣的是,它真的是设计来讲文本数据写为缓存的) 1)bytes、str...
    99+
    2023-01-31
    模块 Python struct
  • 初识python的numpy模块
    目录一、array类型1.1array类型的基本使用1.2对更高维度数据的处理1.3Numpy创建特殊类型的array类型1.3.1生成全为0或全为1的array1.3.2np.ar...
    99+
    2024-04-02
  • python中argparse模块基础及使用步骤
    目录argparse模块用法一、 概念二、 基础1、 使用步骤1.1 总步骤1.2 创建对象1.3 添加参数1.4 解析参数三、 使用案例argparse模块用法 一、 概念 arg...
    99+
    2024-04-02
  • Python中模块的使用--binascii模块用法
    目录binascii模块用法binascii模块和进制转换笔记 Python内置函数binascii模块用法 binascii模块用于在二进制和ASCII之间转换 >...
    99+
    2024-04-02
  • python ipaddress模块使用
    # -*- coding:utf-8 -*- import ipaddress n1 = ipaddress.ip_network('192.0.2.0/28') n2 = ipaddress.ip_network('192.0.2.1/...
    99+
    2023-01-31
    模块 python ipaddress
  • python winrm模块使用
    使用session方法### import winrm s=winrm.Session('http://10.10.60.14:5985/wsman',auth=('administrator','password')) r=s.run_p...
    99+
    2023-01-31
    模块 python winrm
  • python使用syslog模块
        syslog模块是在unix环境下工作的模块,不能用于windows,在windows环境下可以使用logging模块。syslog模块可以用于记录系统运行的信息,这个模块提供的方法有,syslog(priority,messag...
    99+
    2023-01-31
    模块 python syslog
  • Python怎么使用模块
    这篇文章给大家分享的是有关Python怎么使用模块的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.1 导入模块import 模块名form 模块名import 功能名form 模块名 import *impor...
    99+
    2023-06-22
  • python之logging模块使用
    #!/usr/bin/env python # encoding: utf-8 import logging #定义handler的输出格式 formatter=logging.Formatter('%(asctime)s--%(name)...
    99+
    2023-01-31
    模块 python logging
  • Python socket 模块的使用
    一、使用socket实现一对一的简单通信  socket就是一个开往网络应用必备的功能模块。通过这个模块我们可以自己写程序的server端和client端,可以自己定义server端对外提供服务器的ip地址和端口。学会使用这个模块的之后我们...
    99+
    2023-01-31
    模块 Python socket
  • python使用xmlrunner模块生
    unittest默认的TextTestRunner不能生成xml报告,xml报告可以和jenkins集成,也可以用于统计case通过率,为了生成xml报告,需要安装pkg-python-xmlrunner-master.zip这个插件。下载...
    99+
    2023-01-31
    模块 python xmlrunner
  • python Crypto模块的使用
    前一个星期一直再弄爬取网易云音乐的评论,真是一波三折,网页又是动态js,普通的方法获取不了,还有它发送的参数也要经过加密才....这篇文章就是写一下Crypto模块的使用。 Crypto不是自带的模块,需要下载。http://www.vo...
    99+
    2023-01-31
    模块 python Crypto
  • python time模块的使用
    我们先导入必须用到的一个module>>> import time设置一个时间的格式,下面会用到>>>ISOTIMEFORMAT=’%Y-%m-%d %X’看一下当前的时间,和其他很多语言相似这是从epo...
    99+
    2023-01-31
    模块 python time
  • python 安装、配置、使用 xlrd模块、numpy模块、matplotlib、opencv模块
    目录  一、xlrd模块 (一)安装xlrd模块 (二) pycharm 配置xlrd (三) 读取xls格式 (四)xlrd读取时间日期时,会是float类型,需要转换。 二、numpy模块  (一)numpy模块安装---使用清华大学镜...
    99+
    2023-10-23
    python numpy 开发语言
  • python os模块和fnmatch模块的使用介绍
    目录一、先介绍一下os模块1、拆分路径的方法介绍2、构建文件路径的方法介绍3、获取文件属性的方法介绍4、判断文件的类型5、文件和目录操作6、修改文件属性和判断文件属性7、遍历目录树二...
    99+
    2024-04-02
  • python中os模块和sys模块怎么使用
    今天小编给大家分享一下python中os模块和sys模块怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、os模块o...
    99+
    2023-07-05
  • python导入模块的步骤
    这篇文章主要介绍“python导入模块的步骤”,在日常操作中,相信很多人在python导入模块的步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python导入模块的步骤”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • python模块之 aiomysql 异步mysql
    mysql安装教程 mysql语法大全 python 模块pymysql模块,连接mysql数据库 一、介绍 aiomysql 是一个基于 asyncio 的异步 MySQL 客户端库,用于在 Pyt...
    99+
    2023-09-26
    python mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作