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

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

原创
作者头像
oeasy
发布于 2022-11-27 13:16:24
发布于 2022-11-27 13:16:24
80200
代码可运行
举报
运行总次数: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.4K0
[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
5460
[oeasy]python0010 - python虚拟机解释执行py文件的原理
[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
5720
[oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
[oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理
​ 放入路径 回忆上次内容 上次总算可以把 sleep.py 直接执行了 sleep.py文件头部要声明好打开方式 #!/usr/bin/python3 用的是 python3 解释 sl
oeasy
2022/12/13
8330
[oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理
[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
4650
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
[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]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.3K0
[oeasy]python0028_直接运行_修改py文件执行权限_设置py文件打开方式
[oeasy]python0030_设置路径_export_PATH_zsh_系统路径设置_export
​放入路径回忆上次内容 我们要在任意路径下直接执行 sleep.py 把 sleep.py 放在 /usr/bin/ 下面最终可以在任意位置执行程序sleep.py 但是 /usr/bin 里面放的一般都是二进制命令文件命令实在是太多太乱最终还是删除了sleep.py 我想 把宿主目录添加到系统变量 $PATH 中​编辑这样有可能吗?🤔 先回忆🤔 为什么无论当前路径在哪里ls都能执行路径​编辑 ls所在的路径是/usr/bin 是在系统变量$PATH中的#!/usr/bin/python3impor
oeasy
2022/12/17
1.8K0
[oeasy]python0030_设置路径_export_PATH_zsh_系统路径设置_export
[oeasy]python0016_编码_encode_编号_字节_计算机
​编码(encode)回忆上次内容上次找到了字符和字节状态之间的映射对应关系字符对应着二进制字节二进制字节也对应着字符这种字节状态是用2位16进制数来表示的hex(n)可以把数字转化为 ​​16进制​​字符串hexadecimalbin(n)可以把数字转化为 ​​2进制​​字符串integer我们根据ascii中的字符序号能够把字符存储进计算机的字节当中了​编辑终于知道字符对应的字节到底长啥样了但是说到底为啥要把字符对应成字节呢?🤔编码解码字符和字节之间的关系其实是编码 encode解码 decode
oeasy
2022/11/17
1.6K0
[oeasy]python0016_编码_encode_编号_字节_计算机
[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
6850
[oeasy]python0022_框架标题的制作_banner_结尾字符串_end
[oeasy]python0045_转化为10进制数_int_integrate_integer_entire_整数
转化为10进制 回忆上次内容 上这次总结了四种进制 函数名 对应单词 进制类型 数字事例 前缀 bin() binary 2 0b1100001 0b oct() octal 8 0o141 0o h
oeasy
2023/01/13
3330
[oeasy]python0045_转化为10进制数_int_integrate_integer_entire_整数
[oeasy]python0011_ 字符序号_ordinal_ord
​序号(ordinal)回忆上次内容​hello world​​ 不是从来就有的来自于​​unix​​和​​c​​虽然我们今天有各种先进的学习手段最早的高级语言学习是从最早的那张打字机用纸的手写代码起源的输出用的函数名是 ​​print​​ 打印也是从那个时候来的最早输出的是字符串是 ​​"hello world"​也是从那个时候来的这就成了一个迷因等等!计算机里面不都是二进制的 0 和 1 吗哪里来的​​hello​​ 中的 ​​h​​ 之类的字符呢?🤔​编辑字符本质#进入python3解释器pyth
oeasy
2022/11/07
5690
[oeasy]python0011_ 字符序号_ordinal_ord
[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
4920
[oeasy]python0033_任务管理_jobs_切换任务_进程树结构_fg
[oeasy]python0013_ASCII码表_英文字符编码_键盘字符
​ ASCII 码表 回忆上次内容 ​ord(c)​​和​​chr(i)​ 这是俩函数 这俩函数是一对,相反相成的⚖️ ​​ord​​ 通过 ​​字符​​ 找到对应的 ​​数字​​ ​​chr​​ 通
oeasy
2022/11/11
5380
[oeasy]python0013_ASCII码表_英文字符编码_键盘字符
[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
5250
[oeasy]python0014_二进制_binary_bin
Manjaro Linux平台用pyinstaller打包python可执行文件
当我们创建一个python项目,最终的成果如果希望用户能够不依赖于python源代码也能够正常的执行,就会比较的人性化。因为源代码数量众多,很难让每个用户都自行管理所有的源代码,因此我们需要对源码进行编译构建。对于使用场景不是很复杂的,我们可以直接做成一个可执行文件,这样开发者只需要维护可执行文件的功能正常,以及对于各种平台的兼容性较好,这就可以了。这里我们介绍如何使用pyinstaller去通过python源码构造一个可执行文件。
不知名站长
2021/04/01
3.2K0
[oeasy]python0073_进制转化_eval_evaluate_衡量_oct_octal_八进制
oeasy
2023/07/20
2780
[oeasy]python0073_进制转化_eval_evaluate_衡量_oct_octal_八进制
[oeasy]python0031_挂起进程_恢复进程_进程切换
​查看进程回忆上次内容 上次修改了 $PATH 路径 把当前用户shiyanlou的宿主文件夹 ~ 添加到 $PATH 中这样 sleep.py 就可以被找到于是就可以被执行了 还可以把配置 $PATH 的脚本 放到 zsh的配置文件(~/.zshrc) 中 配置 ~/.zshrc 就可以 设置 zsh 环境下默认的 $PATH 在当前路径运行 sleep.py 在 python 程序第 1 行 声明打开方式为 python3 把 /usr/bin/python3 从硬盘调用到内存 成为一个进程 不
oeasy
2022/12/21
4.1K0
[oeasy]python0031_挂起进程_恢复进程_进程切换
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt # 读取文件 with open('/usr/lib/python3.8/LICENSE.txt') as file: text = file.read() # 使用jieba进行中文分词 words = ' '.join(jieba.cut(text)) # 生成词云 wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', # 指定中文字体路径 width=800, height=600, background_color='white').generate(words) # 使用matplotlib展示词云 plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.show()
oeasy
2025/03/01
2980
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
推荐阅读
相关推荐
[oeasy]python0011 - python虚拟机的本质_cpu架构_二进制字节码_汇编语言
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档