pyc文件

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
posted @ 2018-05-26 09:58  朝朝哥  阅读(766)  评论(0编辑  收藏  举报