一、Python 的文件执行原理

1、解释性语言

在这里插入图片描述
通常我们将 Python 和 Java 成为解释性语言,将 C/C++ 成为编译型语言,两者区别如下:
在这里插入图片描述

(1)编译型在这里插入图片描述
(2)解释型
在这里插入图片描述

2、Python 执行过程

在这里插入图片描述

python 先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后解释器会从编译得到的 PyCodeObject 对象中一条一条执行字节码指令,并在当前的上下文环境中执行这条字节码指令,从而完成程序的执行。Python 解释器实际上是在模拟操作中执行文件的过程。PyCodeObject 对象中包含了字节码指令以及程序的所有静态信息,但没有包含程序运行时的动态信息——执行环境(PyFrameObject)。

(1)字节码

字节码在 Python 虚拟机程序里对应的是 PyCodeObject 对象。.pyc 文件是字节码在磁盘上的表现形式。

(2).pyc 文件

PyCodeObject 对象的创建时机是模块加载的时候,即 import
Python test.py 会对 test.py 进行编译成字节码并解释执行,但是不会生成 test.pyc。
如果 test.py 加载了其他模块,如 import util,Python 会对 util.py 进行编译成字节码,生成 util.pyc,然后对字节码解释执行。
如果想生成 test.pyc,我们可以使用 Python 内置模块 py_compile 来编译。
加载模块时,如果同时存在 .py 和 .pyc,Python 会尝试使用 .pyc,如果 .pyc 的编译时间早于 .py 的修改时间,则重新编译 .py 并更新 .pyc。

(3)PyCodeObject

Python 代码的编译结果就是 PyCodeObject 对象。
加载模块时,模块对应的PyCodeObject对象被写入.pyc文件,格式如下:
在这里插入图片描述

二、main() 函数

1、代码执行顺序

python 是一种解释型脚本语言,和 C++/Java 不一样,没有主函数一说,也就是说 python 语句执行不是从所谓的主函数 main 开始的,python 程序从开始到结尾顺序执行

示例:

a = 3
 
def change():
    global a
    a = 10
    return a
 
print a, change(), a
 
if __name__ == "__main__":
    print a, change(), a

执行结果是:
3 10 10

10 10 10

从上面的结果可以看出,在执行 if 后面的语句之前,print a, change(), a 已经执行过了,也就是说程序执行并不是从 main 开始的。

2、__ name __ 属性

python 文件后缀为".py"。 其中分两类:一类是直接执行, 另一类是作为模块被调用(import ***.py)。

__ name __ 作为模块的内置属性,即".py"文件的调用方式。如果等于“__main__"就直接执行本文件, 如果是别的就是作为模块被调用
当运行单个 python 文件时,如运行 a.py,这个时候 a 的一个属性__name__是__main__。当调用某个 python 文件时,如 b.py 调用 a.py,这个时候 a 的属性__name__是模块名a。

python 中的 main 函数的作用:让指定的模块(函数)可以自己单独执行(调试),相当于构造了调用指定函数的入口,这就类似于 C/C++ 里面的 main 函数了。

示例:

#test.py
print('Hello World!')
 
def lhj():
    print('this message is from lhj  function')
 
def main():
    print('this message is from main function')
 
if __name__ == '__main__':
    main()
    print ('now __name__ is %s' %__name__)

执行python test.py 输出:
在这里插入图片描述
这里我们看到我们定义的aaa函数没有被执行,而main函数里面的内容被执行了,表明 if __ name __ == ‘__ main __’: 这条判断语句是通过的,执行了判断条件里的main()。

所以当我们自己写了 .py 文件,想要测试里面的指定函数时,就这样构造一个 main 函数入口就可以调用测试自己写的函数

3、import 命令

通过 import 命令就可以使用其它 .py 文件里面的指定函数,类似于 main 函数。

示例:

test.py

#test.py
print('Hello World!')
 
def aaa():
    print('this message is from aaa  function')
 
def main():
    print('this message is from main function')

call.py

#call.py
from test import aaa	# 将test.py中的模块(函数)导入call.py,需注意test.py和call.py放在同一个文件夹下;
aaa()
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐