前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态

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

原创
作者头像
oeasy
发布2022-11-27 21:16:24
6770
发布2022-11-27 21:16:24
举报

程序本质

回忆上次内容

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

编辑

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

​python3​​ 到底是个啥?

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

复制

编辑

  • 复制到shiyanlou用户文件夹下
  • 再观察
代码语言:javascript
复制
#把/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
复制
#用vi打开这个刚拷贝过来的python3
vi ~/python3.8
  • 这个样子看起来
  • 全是乱码
  • 完全看不懂啊

编辑

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

以字节形式观察python3.8

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 程序本质
    • 回忆上次内容
      • 总结
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档