第一部分 Python如何运行

Python如何运行程序

一、Python 运行时原理

 Python运行脚本时,第一步是编译成所谓的“字节码”,之后将其转发到“虚拟机”中。

1、字节码编译:

当程序执行时,Python内部(对大多数用户是完全隐藏的)会先将源代码(文件中的语句)编译成所谓字节码的形式。编译是一个简单的翻译步骤,而且字节码是源代码底层的、与平台无关的表现形式。概括的说,Python通过把每一条源语句分解为单一步骤来将这些源语句翻译成一组字节码指令。这些字节码可以提高执行速度:比起文本文件中原始的源代码语句,字节码的运行速度要快得多。

如果Python进程在机器上拥有写入权限,那么它将把程序的字节码保存到一个以.pyc为扩展名的文件(“.pyc就是编译过的“.py”源代码)。Python保存字节码是作为一种启动速度的优化。下一次运行程序时,如果你在上次保存字节码之后没有修改过源代码的话,Python将会加载,pyc文件并跳过编译这个步骤。当Python必须重编译时,它会自动检查源文件和字节码文件的时间戳:如果你又保存了源代码,下次程序运行时,字节码将自动重新创建。

如果Python无法在机器上写入字节码,程序仍然可以工作:字节码将会在内存中生成并在程序结束时简单地丢弃。

2、Python虚拟机(PVM)

一旦程序编译成字节码(或字节码从已存在的.pyc文件中载入),之后的字节码发送到通常称为Python虚拟机(Python Virtual Machine, PVM)上来执行。PVM不是一个独立的程序,不需要安装。事实上,PVM是迭代运行字节码指令的一个大循环,一个接一个地完成操作。PVM是Python的运行引擎,它时常表现为Python系统的一部分,并且它是实际运行脚本的组件。从技术上讲,它才是所谓“Python解释器”的最后一步。

图2-2描述介绍的运行时的结构。这些复杂性是有意对Python程序员隐藏起来的。字节码的编译是自动完成的,而且PVM也仅仅是安装在机器上的Python系统的一部分。程序员只需简单的编写代码并运行包括有语句的文件。

注意:

(1)性能的含义

Pyhton与C和C++等完全编译语言相比不同之处:

a.Python的工作中没有“build”或“make”的步骤,代码在写好后立即运行;

b.Python字节码不是机器的二进制编码(例如,Intel芯片的指令)。

Python代码无法运行像C或C++代码一样快,原因是PVM循环(而不是CPU芯片)仍然需要解释字节码,并且字节码指令与CPU指令相比需要更多的工作。

纯Python代码的运行速度比传统解释语言快,原因是和其他经典的解释器不同,这里仍有内部的编译步骤:Python并不需要反复地重分析和重分解每一行语句。

(2)开发的含义

Python执行模块的另一个情况是其开发和执行的环境实际上并没有区别。在Python中,编译器总是在运行时出现,并且是运行程序系统的一部分。

在Python中真正拥有的只有运行时:完全不需要初始的编译阶段,所有的事情是在程序运行时发生的,这甚至还包括了建立函数和类的操作以及连接的模块,这些事情对于静态语言往往是发生在执行之前的。

 二、 Python程序运行方法

1、交互模式下运行代码

这个比较简单,输入代码的结果在按下Enter键后在提示符>>>这一行显示。

在交互提示模式下,用一个空行结束符合语句。

2、系统命令行和文件

模块是一个包含了python语句的简单文本文件。可以直接运行的模块文件往往叫做脚本(一个顶层程序文件的非正式说法)。

python文本文件的运行方式:系统命令行、通过点击图标、通过在IDLE用户界面选择等。

1 # A first Python script
2 import sys
3 print(sys.platform)
4 print(2**100)
5 x = 'Spam!'
6 print(x * 8)

使用命令行运行时需要输入Python的完整路径(在新windows中可以省略python名字)和.py文件的完整路径

C:Userszjp> C:UserszjpDesktop1.py
win32
1267650600228229401496703205376
Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!

点击图标运行时,会出现窗口一闪而过,可以在文件最后加input()命令。

此外还可以通过IDLE界面中的F5运行。

三、模块导入和重载

每一个以扩展名py结尾的Python源代码文件都是一个模块,其它的文件可以通过导入一个模块读取这个模块的内容。导入从本质上来讲,就是载入另一个文件,并能够读取那个文件的内容。一个模块的内容通过这样的属性能够被外部世界使用。

这种基于模块的方式使模块变成Python程序架构的一个核心概念。更大的程序往往以多个模块文件的形式出现,并且导入了其他模块文件的工具。其中的一个模块文件设计成主文件,或叫做顶层文件(就是启动后能够运行整个程序的文件)。

例如,如果开始一个交互对话(从系统命令行、从开始菜单或者在IDLE中),可以通过简单的import来实现(确保删除了上面添加的input行)

>>> import script1
win32
1267650600228229401496703205376
Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
>>> import script1
>>> import script1

在默认情况下,只是在每次会话的第一次运行,在第一次导入之后,其他的导入都不会再工作,甚至在另一个窗口中改变并保存了模块的源代码也不行。这是有意设计的结果。导入是一个开销很大的操作,以至于每个文件,每个程序运行不能够重复多余一次。

如果真的想要在同一次会话中再次运行文件(不停止和重新启动会话),需要调用imp标准库模块中可用的reload函数。

>>> from imp import reload
>>> reload(script1)
win32
1267650600228229401496703205376
Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
<module 'script1' from 'D:Python27script1.pyc'>

  模块的显要特性:属性

从更宏观的角度来看,模块扮演了一个工具库的角色。从一般意义上来说,模块往往是变量名的封装,被认作是命名空间。在一个包中的变量名就是所谓的属性:也就是说,属性就是绑定在特定对象上的变量名(就像一个模块)。

在典型的应用中,导入者得到了模块文件中在顶层所定义的所有变量名。这些变量名通常被赋值给通过模块函数、类、变量以及其他被导出的工具。表面上看,一个模块文件的变量名可以通过两个python语句读取——import和from,以及reload调用。

dir函数可以获得模块内部的可用的变量名的列表。

>>> dir(script1)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'sys', 'x']

  双下划线开头并结尾的变量名,这些通常是由python预定义的内置变量名,那些通过代码赋值而定义的变量在dir结果的最后显示。

原文地址:https://www.cnblogs.com/iambitiousman/p/4524588.html