第二章 Python运行程序
一、Python解释器
解释器是什么:
是一种可以让其他程序运行起来的程序
Python解释器:
Python也是一个名为解释器的软件包,当编写了一段Python程序,Python解释器将读取程序,并按照其中命令执行,得出结果。Python代码必须在解释器中运行。
Python包:
Python包安装在机器上后,包含了一些最小化组件:一个解释器和支持的库。
Python解释器的执行:
根据使用情况的不同,Python解释器可能采取可执行程序的形式,或是作为链接到另一个程序的一系列库【不是很理解,链接是指被另一个模块文件引用吗】
Python解释器的实现形式:
根据Python版本的不同,解释器本身可以用C程序实现,或一些Java类实现,或其他形式。
二、Python文件
可以使用任何编辑器编写python语句,按照惯例,Python文件是以.py结尾的。从技术角度看,这种命名方案在被import时才是必须的【如果这个文件不需要被其他python导入,命名时不加后缀.py也是可以的】;但是为了统一,绝大多数Python文件都是以.py结尾的。
三、程序的执行过程
(一)字节码编译
编译:
程序执行时,python内部先将py文件中的语句【源代码】编译成字节码。
字节码是什么:
每一条python语句翻译成一组字节码指令
字节码的好处:
比起源代码,字节码的运行速度快得多
字节码的存在形式【.pyc文件】:
如果python进程在机器上【电脑】拥有写入权限,当程序运行后,在py文件的同级目录下可以看到一个.pyc文件,这里面即是py文件的字节码
保存.pyc文件的好处:
可以优化启动速度。如果py文件没有修改过,那么下次运行同一文件的时候,python会跳过编译步骤,直接加载.pyc文件。
如果源文件修改了,第一次保存的pyc文件还有用吗:
python第二次运行同一程序时会自动检查源文件和字节码的时间戳。如果又保存了源文件,python检查到时间戳不一致,这时运行程序,会自动重新创建字节码【重新进行了编译过程】
如果没有.pyc文件,字节码存在于哪里:
如果python无法在机器上写入字节码,字节码将会在内存中生成,并在程序结束时丢弃。
在大型程序中,最好保证python进程拥有机器的写入权限。因为字节码文件也是分发python程序的方式之一:如果python找到的都是pyc文件,同样可以运行程序,即使这个目录下面没有py源文件
字节码与二进制代码:
Python字节码不是机器的二进制代码, 它是特定于Python的一种表现形式。
Python代码无法运行得像C或C++一样快,因为PVM仍需要解释字节码,字节码指令与CPU指令【机器码】相比需要更多的工作
(二)python虚拟机【PVM】
虚拟机的工作:执行字节码
程序编译成字节码或者字节码从已存在的.pyc文件中载入,之后,字节码发送到python虚拟机上执行。
PVM是迭代运行字节码指令的大循环,一个接一个完成操作【手动问号,不是很理解】
PVM时常表现为python系统的一部分,是实际运行脚本的组件。从技术上讲,它是所谓“python解释器”的最后一步
(三)Python具有动态语言特性
Python的编译和PVM的解释都是在程序运行时发生的,而对于静态语言,编译、链接都是发生在程序执行之前。这是运行Python程序和运行其他静态语言的不同之处。所以,Python带来了更加动态的编程体验。
四、Python实现的替代者
Python有3种主要实现方式:CPython、Jython、IronPython。CPython是标准的实现,其他的都是有特定目标和角色的。
Python的一些次要实现形式,如Stackless Python。
所有的这些实现方式都只是用来实现Python语言的,只是通过不同的形式执行程序。无论哪种实现形式,编写python文件时,Python语句都是一样的。
这些实现方式都是通过把源代码编译成字节码,然后在合适的虚拟机上执行这些字节码。
(一)CPython
CPython:
原始的、标准的Python实现方式通常称作CPython
CPython是由可移植的ANSI C语言代码编写成的,所以取名CPython
哪里获取CPython:
从http://www.python.org获取的、或者大多数电脑上预装的Python,都是CPython
什么时候用CPython:
除非希望使用Python脚本化Java或.NET,其他时候都用CPython
(二)Jython
Jython:
Jython最初称JPython,目的是为了与Java编程语言集成。
Jython包含了Java类,这些类编译Python源代码,形成Java字节码,将得到的字节码映射到Java虚拟机【JVM】上。
Jython的目标:
Jython的目标是为了让Python代码能够脚本化Java应用程序,就像CPython允许Python脚本化C和C++组件一样。
它实现了与Java的无缝集成。Python代码被翻译成Java字节码后,在运行时看起来就像一个真正的Java程序一样。
Jython脚本的应用:
Jython脚本可以应用于开发web applet和servlet,建立基于Java的GUI。此外,Jython允许导入Python代码或使用Java的类【这些类就像是用Python编写的一样】
因为Jython比CPython慢而且不够健壮,它往往被看做Java开发者的一个有趣工具,面向寻找Java代码前端脚本语言【没读懂】
(三)IronPython
IronPython:
IronPython比Cpython和Jython要新,其设计目的是让Python程序可以与Windows平台的.NET框架以及与之对应的Linux上开源的Mono编写的应用集成
本着像微软早期的COM模型一样的精神,将.NET和C#程序语言的运行系统设计成与语言无关的对象通信层。
IronPython既可以用作客户端,也可以用作服务器端的组件,还可以与其他.NET的语言进行通信
五、执行优化工具
Psyco即时编译器、Shedskin C++转换器优化了基本执行模块
(一)Psyco即时编译器
Psyco:
是一个扩展字节码执行模块的组件,可以让程序运行得更快。
Psyco是一个PVM的增强工具,可以收集并使用信息,在程序运行时,将部分程序的字节码转换成底层的二进制机器码,从而实现更快的执行速度。
通过使用Psyco即时编译器,程序运行得更快。理想情况下,一些通过Psyco优化的Python代码的执行速度可以像编译好的C代码一样快。
因为字节码的转换与程序运行同时发生,所以Psyco被看做一个即时编译器【JIT】
Psyco提速程度:
据官方网站介绍,Psyco提供了“2-100倍的速度提升,典型值为4x”
(二)Shedskin C++转换器
Shedskin:
是一个引擎系统,采用了不同的Python程序执行方法:它尝试将Python代码变为C++代码,然后使用机器中的C++编译器将C++代码编译成机器代码。
它以一种平台无关的方式来运行Python代码。
初步结果显示Shedskin具有比标准的Python代码及使用Pyscho扩展后更快的执行速度的潜质。
六、冻结二进制文件
冻结二进制文件:
有时候,需要一种能够让Python程序生成独立的可执行二进制代码的简单方法。
python程序被转换成可执行程序后被称作冻结二进制文件Frozon Binary
冻结二进制文件能够将程序的字节码、PVM【解释器】及任何程序所需的Python支持文件捆绑在一起,形成一个单独的文件包。过程可能会不同,但实际的结果将会是一个单独的可执行二进制程序[如Windows中的.exe文件]
可以生成冻结二进制文件的工具:
py2exe:在Windows下使用。py2exe可以封装使用了tkinter、PMW、wxPython和PyGTK GUI库的独立程序;应用pygame进行游戏编程的程序;win32com客户端的程序等。
PyInstaller:和py2exe类似,它在Linux及Unix上使用,并且能够生成自安装的二进制文件以及freeze[最初始的版本]
冻结二进制文件与真实的编译输出结果有所不同:
它们通过虚拟机运行字节码。
因此,如果离开了必要的初始改进,冻结二进制文件和最初的源代码程序的运行速度完全相同。
冻结二进制文件并不小[包括PVM],但是以目前的标准来衡量,它们的文件也不是特别大。
冻结二进制文件的运行:
冻结二进制文件中因为嵌入了Python,所以接收端不需要安装Python就可以运行这些冻结二进制文件。
由于代码嵌在冻结二进制文件中,对于接收者来说,代码都是隐藏的。这点对于商业软件开发者来说,是特别有吸引力的。例如,一个Python编码的基于tkinter工具包用户界面可以封装成一个可执行文件,并且可以作为一个CD中或网络上独立的程序进行发售。
而终端用户无需安装Python去运行这些发售的程序