1. python解释器执行流程
# 总流程
源代码——编译》字节码(pyc文件)——解释》机器码
1.先进行编译,将源代码的编译结果(字节码)放在内存中的PyCodeObject对象中
2.解释器将字节码转化成机器码
3.程序执行结束,解释器则将内存中PyCodeObject写回到pyc文件中
4.再次执行该程序时,查看pyc文件,如果pyc字节码文件存在,且源代码文件与字节码文件最后修改时间一致,直接转化为机器码
5.源代码变化,则从第一步开始,没有变化则从第二步开始,按此循环
2.生成pyc文件场景
1. 为什么要生成pyc
从刚才的执行流程中,pyc文件的存在可以省略编译的过程,提升执行效率
2.重用性比较多的,python解释器将import进来的模块,默认产生pyc,这些模块复用性更强
3. 实例
# 文件one.py
[root@localhost test]# cat one.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
def get_now_time():
print(datetime.datetime.now())
return "当前时间:%s" % (datetime.datetime.now())
# 文件two.py,two.py文件中使用one.py中的函数,通过import导入
[root@localhost test]# cat two.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from one import get_now_time
if __name__ == '__main__':
res = get_now_time()
print("获取结果--%s" % res)
# 执行two.py 文件
[root@localhost test]# ls
one.py two.py
[root@localhost test]# python3 two.py
2019-03-16 18:08:38.119045
获取结果--当前时间:2019-03-16 18:08:38.119163
# 产生了pyc文件
[root@localhost test]# ls -a
. .. one.py __pycache__ two.py
[root@localhost test]# cd __pycache__/
[root@localhost __pycache__]# ls
one.cpython-37.pyc
3.手动生成pyc文件
1. python -m
2. py_compile
# 被编译的目标文件
[root@localhost test]# cat three.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print("@@@@@@@@@@@@")
# create_pyc.py
[root@localhost test]# cat create_pyc.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import py_compile
res=py_compile.compile("/qqc_ceshi/test/three.py")
print(res,"$$$$$$$$$$")
[root@localhost test]# python3 create_pyc.py
/qqc_ceshi/test/__pycache__/three.cpython-37.pyc $$$$$$$$$$
[root@localhost __pycache__]# ls -a
. .. one.cpython-37.pyc three.cpython-37.pyc
# 执行pyc文件
[root@localhost __pycache__]# python3 three.cpython-37.pyc
@@@@@@@@@@@@
3. import py_compileall