python编译文件相关

前言

民间流传一种说法,python 是一门解释性语言,其实是错的,因为他有 pyc 文件类似 java 的 .class 文件,同时有编译性语言和解释性语言的特点

解释型语言的定义:

1
解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。这样解释型语言每执行一次就要翻译一次,效率比较低

python 虽然不是出生名门,但本质和 java,c# 一样,囊括为两个词就是字节码和虚拟机

这里主要归纳整理 python 解释器(是的,依然是解释器,但是带编译功能,python 的编译器和解释器看起来并没明显界限),虚拟机相关的一些基础知识

1.什么是字节码

2.什么是 PyCodeObject

3.什么是 pyc,pyo 文件

4.python 虚拟机简介

5.python 解释器列表

什么是字节码

python运行时候,python 解释器会先把 .py 源代码编译为字节码,然后再把字节码丢到 python 虚拟机里面翻译为机器能识别的机器码并运行。在这里 python 的字节码由多个 PyCodeObject (字节码对象)生成,对应的是一段 c 代码(实际上也是一段指令集)

什么是PyCodeObject

python 编译器在对 .py 源代码编译过程中,对代码块(code block)会编译为 PyCodeObject 对象,那在 python 里面哪些可以算作一个代码块呢?函数,类,模块,都可以当做一个代码块,当编译源文件的时候,这些代码块都会生成与之相对应的 PyCodeObject 对象,并存储在内存中

什么是pyc,pyo文件文件

.pyc 或者 .pyo 后缀文件就是字节码(由多个PyCodeObject组成)在磁盘上的表现形式(程序执行完后会存字节码在本地磁盘),方便下次运行直接加载PyCodeObject,免得重新编译

需要 .pyc 文件有两个理由

1.省去重复编译,加载速度高于 .py源文件

2.隐藏源代码信息(虽然pyc文件可以被反编译)

手工编译 pyc 命令如下:

1
2
python -m py_compile file.py
python -m py_compile /root/src/{file1,file2}.py

当然也可以用python程序里调用编译模块来编译,如下:

1
2
import py_compile 
py_compile.compile('path') //path是包括.py文件名的路径,如果是个目录就解释该目录下所有文件

pyo是优化后的字节码文件 python -O 源文件 即可将源程序编译为pyo文件

python虚拟机简介

python虚拟机主要作用就是翻译 python 编译器编译出来的字节码为机器能识别的机器码,然后供计算机运行,实际上。(实际上python里面的编译器和虚拟机是同一库文件)

python解释器列表

由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写 Python编译器来执行 Python代码(当然难度很大)。事实上,确实存在多种 Python 解释器,官方目前推荐的是CPYTHON

CPython

当我们从 Python 官方网站下载并安装好 Python 2.7后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用 C 语言开发的,所以叫 CPython。在命令行下运行 python 就是启动 CPython 解释器

CPython 是使用最广的 Python 解释器。教程的所有代码也都在 CPython 下执行

IPython

IPython 是基于 CPython 之上的一个交互式解释器,也就是说,IPython 只是在交互方式上有所增强,但是执行 Python 代码的功能和 CPython 是一样的(些许差别,比如代码块定义就不同)。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE

CPython 用>>>作为提示符,而IPython用In [序号]:作为提示符

PyPy

PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度

绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点

Jython

Jython是运行在Java平台上的Python解释器,可以直接把Python代码解释成Java字节码执行

IronPython

IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码

坚持原创技术分享,您的支持将鼓励我继续创作!