pyc和pyo是什么
-
1.pyc是Python保存字节码,若源码无修改,下次直接加载pyc,跳过把py『编译』成字节码pyc这个步骤,以优化启动速度;
- 2.pyo也是字节码,比pyc更小。
什么时候会生成pyc、pyo文件?
import包的时候。比如当import一个包比如datetime时,就会产生datetime.pyc文件,当下次导入datetime包的时候,Python会对比字节码和源码修改时间,若无修改则直接加载pyc文件,跳过对datetime进行『编译』这个步骤
如何手动生成
生成pyc文件
python -m py_compile a.py b.py c.py
就会生成a.pyc b.pyc c.pyc生成pyo文件
python -O -m py_compile a.py b.py c.py
就会生成a.pyo b.pyo c.pyo
Python 运行机制
- 完成模块的加载和链接
- 将源代码翻译为PyCodeObject对象(这货就是字节码),并将其写入内存当中(方便CPU读取,起到加速程序运行的作用)
- 从上述内存空间中读取指令并执行;程序结束后,根据命令行调用情况(即运行程序的方式)决定是否将PyCodeObject写回硬盘当中(也就是直接复制到.pyc或.pyo文件中)
- 之后若再次执行该脚本,则先检查本地是否有上述字节码文件。有则执行,否则重复上述步骤。
用途
不让别人看源码
禁止生成pyc文件
import sys
sys.dont_write_bytecode=True
AttributeError: ‘module’ object has no attribute’xxx
命名py脚本时,不要与python预留字,模块名等相同
删除该库的.pyc文件(因为py脚本每次运行时均会生成.pyc文件;在已经生成.pyc文件的情况下,若代码不更新,运行时依旧会走pyc,所以要删除.pyc文件),重新运行代码;或者找一个可以运行代码的环境,拷贝替换当前机器的.pyc文件即可