首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态

[oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态

原创
作者头像
oeasy
发布于 2022-11-27 13:16:24
发布于 2022-11-27 13:16:24
76500
代码可运行
举报
运行总次数:0
代码可运行

程序本质

回忆上次内容

  • ​\n​​ 就是换行
  • 他对应着 ​​ascii​​ 字符的代码是(​​10​​)​​10进制​
  • 他的英文是 LF,意思是​​Line Feed​
  • 我们可以在《安徒生童话》中找到每个字符对应的字节形态

编辑

  • 不光txt文件是文件
  • 我们的python游乐场本质上也是一个二进制可执行的文件
  • 这个文件在哪?
  • 我们可以读懂这个可执行文件吗?🤔

​python3​​ 到底是个啥?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
which python3
ll /usr/bin/python3
  • 这个 python3
  • 是一个符号链接文件
  • 只有9字节
  • 他指向 python3.8
  • python3.8
  • 也在 /usr/bin 里面
  • 就是/usr/bin/python3.8

编辑

  • python3.8
  • 是一个5.3M的文件
  • 可以看得见
  • 可以直接运行这个phthon3.8吗?

直接运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/bin/python3.8
  • ​python3.8​​ 就在硬盘里呆着
  • 位置就在/usr/bin/python3.8
  • usr 是 unix software resource
  • bin 是二进制 binary
  • python3.8 是这个文件的名称
  • 在运行命令的时候
  • 把这个文件从硬盘装载到内存
  • 然后用 cpu 开始逐行执行文件中的0101指令
  • 可以把他复制到shiyanlou用户的宿主文件夹下吗?

复制

编辑

  • 复制到shiyanlou用户文件夹下
  • 再观察
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#把/usr/bin/python3这个py文件的解释器拷贝到~(当前用户文件夹)
#cp的意思是copy
cp /usr/bin/python3 ~
#确认python3已经拷到~(当前用户文件夹)
#ls的意思是list
ls ~/python3.8
#查看python3文件细节
ls -lah ~/python3.8
  • python3 指向的 python3.8 只有 5.3M
  • 这个可执行文件怎么这么小?
  • 5.3M 这也就是一张照片的大小
  • 以前的 Python3.5 只有 4.3M
  • 更小
  • 目前这 5.3M 的 Python3 里面到底有什么呢?🤔

研究 python3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#用vi打开这个刚拷贝过来的python3
vi ~/python3.8
  • 这个样子看起来
  • 全是乱码
  • 完全看不懂啊

编辑

  • 这个东西我们确实看不懂

以字节形式观察python3.8

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi ~/python3.8
  • 用vim打开~/python3.8

编辑

  • :
  • 进入命令行模式
  • ​:%!xxd​​我们可以看到这个文件的二进制形态
  • ​%​​是指的对于所有行的范围
  • ​!是执行外部命令​
  • ​xxd​​指的是转化为 16 进制形式
  • 什么是xxd命令呢?

xxd

  • xxd 可以查看文件的二进制形态
  • dump的本意是(倾倒垃圾)
  • 这里指的是转储
  • 把文件转储为16进制形式汇编代码形式

编辑

  • ​:xxd –r​​ 可以还原回去 😉
  • ​:%!xxd​​ 转成字节形态
  • ​:%!xxd –r​​ 转回文本形态
  • 反复横跳...

另存为python3.8hex

  • 一行是(16)10 进制 个字节
  • G
  • 总共有 343148 行

编辑

  • 这就是 真正的机器语言🤭
  • cpu能执行的东西
  • 真真切切看到了的
  • 真的存在硬盘上 01010 的二进制可执行指令!!
  • 这些指令执行出来就是我们的游乐场!!!
  • 或者说是我们的python虚拟机
  • 可是这个指令我们看不懂怎么办?🤔
  • 先把他另存出来
  • :w python3.8hex
  • 把当前缓存(buffer)另存(write)为
  • python3.8hex
  • 对python3.8强制退出
  • :q!
  • 不保存修改强制退出
  • python3.8hex就是我们要的机器语言的字节形态
  • 可是这字节形态我们还是看不懂啊

总结

  • ​python3​​ 的程序是一个 5.3M 的可执行文件
  • 我们通过which命令找到这个python3.8的位置
  • 将这个python3.8复制到shiyanlou的用户目录下
  • 这个文件还是能够执行的
  • 将这个文件转化为字节形态
  • 确实可以转化
  • 但是这个文件我们看不懂啊!!!😭

编辑

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[oeasy]python0011 - python虚拟机的本质_cpu架构_二进制字节码_汇编语言
​程序本质回忆上次内容我们把python源文件词法分析 得到 词流(token stream)语法分析 得到 抽象语法树(Abstract Syntax Tree)编译 得到 字节码 (bytecode)字节码我们看不懂所以反编译 得到 指令文件(opcode)​编辑指令文件是基于python虚拟机的虚拟cpu的指令集什么是python虚拟机呢?🤔在了解虚拟cpu之前我们先看看真实的cpu真实的cpu无论手机还是计算机最核心器件的器件就是cpu​编辑这个东西是个实实在在存在的实体我们所说的pytho
oeasy
2022/10/27
1.1K0
[oeasy]python0011 - python虚拟机的本质_cpu架构_二进制字节码_汇编语言
[oeasy]python0022_ python虚拟机_反编译_cpu架构_二进制字节码_汇编语言
​程序本质回忆上次内容​python3​​ 的程序是一个 5.3M 的可执行文件我们通过which命令找到这个python3.8的位置将这个python3.8复制到我们的用户目录下这个文件还是能够执行的将这个文件转化为字节形态确实可以转化但是这个文件我们看不懂啊!!!😭​编辑怎么才能看懂这些东西呢?🤔这个东西我们确实看不懂但是有人能看懂谁呢?真实的cpu无论手机还是计算机最核心器件的器件就是cpu​编辑这个东西是个实实在在存在的实体这个cpu就能看懂这些字节码吗?cpucpu能看懂这些字节码!!!这
oeasy
2022/11/29
1.3K0
[oeasy]python0022_ python虚拟机_反编译_cpu架构_二进制字节码_汇编语言
[oeasy]python0010 - python虚拟机解释执行py文件的原理
​解释运行程序 🥊回忆上次内容我们这次设置了断点设置断点的目的是更快地调试调试的目的是去除​​bug​​别害怕​​bug​​一步步地总能找到​​bug​​这就是程序员基本功调试​​debug​​我心中还是有疑问​​python3​​ 是怎么解释​​hello.py​​ 的?🤔纯文本我们的py文件是一个纯文本文件​编辑​打开我们的guido.py​如果没有就新做一个这里面是一个个的字符print("1982------Guido in cwi")print("1995------Guido in cnri
oeasy
2022/10/21
5150
[oeasy]python0010 - python虚拟机解释执行py文件的原理
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
print("1982------Guido in cwi") print("1995------Guido in cnri") print("2000------Guido in beopen") print("2005------Guido in google") print("2012------Guido in dropbox") print("2020------Guido in microsoft")
oeasy
2023/04/16
4420
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
[oeasy]python0045_转化为10进制数_int_integrate_integer_entire_整数
转化为10进制 回忆上次内容 上这次总结了四种进制 函数名 对应单词 进制类型 数字事例 前缀 bin() binary 2 0b1100001 0b oct() octal 8 0o141 0o h
oeasy
2023/01/13
3070
[oeasy]python0045_转化为10进制数_int_integrate_integer_entire_整数
[oeasy]python0016_编码_encode_编号_字节_计算机
​编码(encode)回忆上次内容上次找到了字符和字节状态之间的映射对应关系字符对应着二进制字节二进制字节也对应着字符这种字节状态是用2位16进制数来表示的hex(n)可以把数字转化为 ​​16进制​​字符串hexadecimalbin(n)可以把数字转化为 ​​2进制​​字符串integer我们根据ascii中的字符序号能够把字符存储进计算机的字节当中了​编辑终于知道字符对应的字节到底长啥样了但是说到底为啥要把字符对应成字节呢?🤔编码解码字符和字节之间的关系其实是编码 encode解码 decode
oeasy
2022/11/17
1.5K0
[oeasy]python0016_编码_encode_编号_字节_计算机
[oeasy]python0036_牛说_cowsay_小动物说话_asciiart_figlet_lolcat_管道(祝大家新年快乐~)
​牛说(cowsay)回忆上次内容上次我们研究了shell脚本的编程 并且在shell中实现了 循环语句延迟命令清屏命令python命令figlet命令​编辑还能整点什么呢?🤔还想要让小动物报时cowsay首先要安装 cowsaysudo apt install cowsay 装完之后 cow 就可以 say 了吗?​编辑怎么say呢?利用管道利用管道(pipe)来say​编辑如何与报时函数整合呢?整合这如何和我们的报时程序整合呢?#!usr/bin/python3import timeprin
oeasy
2022/12/31
1K0
[oeasy]python0036_牛说_cowsay_小动物说话_asciiart_figlet_lolcat_管道(祝大家新年快乐~)
[oeasy]python0045_四种进制_binary_octal_decimal_hexadecimal
四种进制回忆上次内容 上次研究了 通过 八进制数值 转义 \ooo把(ooo)8进制对应的ascii字符输出 转义序列 \n、\t 是 转义序列\xhh 也是 转义序列\ooo 还是 转义序列现在 总共有 几种进制 了呢?🤔先数一下 树数树树 就是这么多棵树用八进制的方式 数树八进制八根手指头 (13)8进制棵这是用 八根手指头 数的 如果换成 十根手指头呢?10进制用十根手指头数树 (11)10进制棵到底多少棵树?哪个才对呢? (13)8进制棵(11)10进制棵数树在不同进制下 有不同的数值都是正
oeasy
2023/01/12
2180
[oeasy]python0045_四种进制_binary_octal_decimal_hexadecimal
[oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
​十六进制(hexadecimal)回忆上次内容上次数制可以转化bin(n)可以把数字转化为 ​​2进制​binary接收一个整数(int)得到一个二进制数形式的字符串​编辑数字在计算机中是用二进制存储的但是展示给我们的时候用的是十进制​编辑也就是0-9这10个字符的形式都说字节是计算机存储的最小单位这些数字在字节里面长什么样子呢?🤔字节首先明确字节长什么样子?​编辑1 个 字节(byte)正好 8 个 位(bit)​编辑如果我们用一个数字来表示一个字节的话需要表示[0,28-1]至少需要3
oeasy
2022/11/15
5140
[oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
[oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话
Basic Combined Programming Language(BCPL)
oeasy
2022/11/25
1.1K0
[oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话
[oeasy]python0073_进制转化_eval_evaluate_衡量_oct_octal_八进制
oeasy
2023/07/20
2440
[oeasy]python0073_进制转化_eval_evaluate_衡量_oct_octal_八进制
[oeasy]python0011_ 字符序号_ordinal_ord
​序号(ordinal)回忆上次内容​hello world​​ 不是从来就有的来自于​​unix​​和​​c​​虽然我们今天有各种先进的学习手段最早的高级语言学习是从最早的那张打字机用纸的手写代码起源的输出用的函数名是 ​​print​​ 打印也是从那个时候来的最早输出的是字符串是 ​​"hello world"​也是从那个时候来的这就成了一个迷因等等!计算机里面不都是二进制的 0 和 1 吗哪里来的​​hello​​ 中的 ​​h​​ 之类的字符呢?🤔​编辑字符本质#进入python3解释器pyth
oeasy
2022/11/07
5400
[oeasy]python0011_ 字符序号_ordinal_ord
[oeasy]python0028_直接运行_修改py文件执行权限_设置py文件打开方式
​直接运行回忆上次内容 我们把两个程序整合起来了 可以持续输出当前时间每秒都更新​编辑 但是我想在 shell 里面 只输入文件名(./sleep.py)并回车就能不断输出时间可能吗?🤔import timewhile True: print(time.asctime()) time.sleep(1)尝试执行第 1 句 根本没有找到 sleep.py​编辑 第 2 句 根据相对路径路径./ 找到了 sleep.py 其中 . 代表的是当前目录在/home/shiyanlou/找到slee
oeasy
2022/12/11
1.2K0
[oeasy]python0028_直接运行_修改py文件执行权限_设置py文件打开方式
[oeasy]python0022_框架标题的制作_banner_结尾字符串_end
​结尾字符串(end)回忆上次内容​python3​​ 的程序是一个 5.3M 的可执行文件​​python3​​ 里面存的是 cpu 指令可以执行的那种我们可以把指令对应的汇编找到​​objdump -d ~/python3 > python3.asm​​汇编语句是和当前机器架构的指令集相关的​​uname -a​​可以查询指令集我们执行的过程其实是系统先执行​​python3​​这个可执行文件在内存中构建解释器将参数​​hello.py​​ 放入解释器​python3​​解释器 对于​​hello.py
oeasy
2022/12/01
6280
[oeasy]python0022_框架标题的制作_banner_结尾字符串_end
[oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理
​ 放入路径 回忆上次内容 上次总算可以把 sleep.py 直接执行了 sleep.py文件头部要声明好打开方式 #!/usr/bin/python3 用的是 python3 解释 sl
oeasy
2022/12/13
8080
[oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理
[oeasy]python0017_解码_decode_字节序列_bytes_字符串_str
​解码 decode回忆上次内容code就是码最早也指电报码后来有各种编码、密码、砝码、条码都指的是把各种事物编个号encode就是编码编码就是给事物编个号​编辑编码基本了解了给事物编号就是编码怎么通过编号找到原来的事物呢?解码解码是编码的逆运算解铃换需系铃人​编辑上次把白菜编上号这次扫到号知道是白菜扫到码就知道这个条码对应这个大白菜并知道价格​编辑这解码用英文怎么说呢?解码(decode)de 的意思是相反的defuse 解除保险炸弹引信decolor 漂白defame 中伤destruct
oeasy
2022/11/19
5040
[oeasy]python0017_解码_decode_字节序列_bytes_字符串_str
[oeasy]python0071_字符串类型_str_string_下标运算符_中括号
oeasy
2023/07/07
1860
[oeasy]python0071_字符串类型_str_string_下标运算符_中括号
[oeasy]python0014_二进制_binary_bin
​二进制(binary)回忆上次内容上次我们了解了​​ASCII​​码表​ASCII​​ 码表就是​​A​​merican ​​S​​tandard ​​C​​ode for ​​I​​nformation ​​I​​nterchange美国信息交换标准代码ASCII 码表范围​0x30-0x39​​ 这个范围是 ​​数字​数字的编码减去 ​​0x30​​ 正好得到数字本身​​0x41-0x5A​​ 这个范围是 ​​大​​ 写字母​​0x61-0x7A​​ 这个范围是 ​​小​​ 写字母​​0x20-0x7
oeasy
2022/11/13
4680
[oeasy]python0014_二进制_binary_bin
将Python脚本打包成可执行文件
本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstaller,其它仅作比较和参考。
hbbliyong
2018/10/09
2.7K0
[oeasy]python0033_任务管理_jobs_切换任务_进程树结构_fg
​查看进程回忆上次内容 上次先进程查询 ps -elf 查看所有进程信息ps -lf 查看本终端相关进程信息 杀死进程 kill -9 PID 给进程发送死亡信号 运行多个 python3 show_time.py 的话 各个进程独立python3 show_time.py 大概 8+M各占内存这些进程之间是什么关系呢?🤔​编辑具体查询 zsh进程相关的 3 个进程 zsh(当前的 shell 环境) zsh(shell本身)进程 /usr/bin/python3 /home/shiyanlou/sl
oeasy
2022/12/26
4690
[oeasy]python0033_任务管理_jobs_切换任务_进程树结构_fg
推荐阅读
相关推荐
[oeasy]python0011 - python虚拟机的本质_cpu架构_二进制字节码_汇编语言
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档