Python 的文件执行原理与 main 函数
一、Python 的文件执行原理1、解释性语言通常我们将 Python 和 Java 成为解释性语言,将 C/C++ 成为编译型语言,两者区别如下:(1)编译型(2)解释型2、Python 执行过程python 先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后解释器会从编译得到的 PyCodeObject 对象中一条一条执行字节码指令,并在当前的上下文环境中执行这条字节码指令,从而完成程
一、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()
更多推荐
所有评论(0)