有时候在python代码运行结束后会产生pyc文件,有时候又不会产生。那么,到底什么时候会产生?以及pyc文件到底起什么作用?进行了梳理和总结。
首先,了解python程序的运行过程
python程序的运行依赖于解释器(interpreter)。
Python解释器(interpreter)在执行任何一个Python程序文件时,首先进行的动作都是先对文件中的Python源代码进行编译,编译的主要结果是产生一组Python的字节码(byte code),然后将编译的结果交给Python虚拟机(Virtual Machine),由虚拟机按照顺序一条一条地执行字节码,从而完成对Python程序的执行动作。
pyc文件是什么
对于Python编译器来说,PyCodeObject对象是其真正的编译结果,PyCodeObject对象保存在内存中。在程序运行结束时,会根据规则决定是否将PyCodeObject对象写回硬盘,如果写回硬盘,就会生成pyc文件,所以,pyc文件只是这个PyCodeObject对象在硬盘上的表现形式。
什么时候会产生pyc文件
假如我们写一个简单的python程序:
test_pyc.py
print(“hello pyc”)
python3 test_pyc.py运行程序,发现并没有生成pyc文件。
那么如何生成pyc文件呢,可以使用命令python -m compileall -b .来生成pyc文件,会在和py文件对应的目录下生成pyc文件。
pyc文件有什么作用
pyc文件是由.py文件经过编译后生成的字节码文件,其加载速度相对于之前的.py文件有所提高,而且还可以实现源码隐藏,以及一定程度上的反编译。因此,不同版本的python可能运行不了同一个pyc文件。
一、编译生成pyc:(1)单个文件>>import py_compile>>py_compile.compile(r'H:/game/test.py')(2)多个文件>>>import compileall>>>compileall.compile_dir(r'D:\test')(3)直接通过命令来运行,可以看到下面的命令中并没有用到compile()函数,
这是因为py_compile模块的main()函数中调用了compile().
python-m py_compile test.py
python-O-m py_compile test.py-O 优化成字节码-m 表示把后面的模块当成脚本运行-OO 表示优化的同时删除文档字符串
如果你想看compile(), compile_dir(), compile_path()具体每个参数是干吗用的,可以使用print
py_compile.compile().__doc__来查看,或者直接打开py_compile.py,compileall.py文件来看。
二、运行Pyc>>> Python test.pyc
三、测试'''
假设我们的文件夹下,只有文件Test.pyc,这个文件是将Test.py文件编译而得。但是这个文件需要调用文件Gl.py,先不将Gl.py转为Gl.pyc文件。
执行下面命令:
'''
D:\A\B\__pycache__>python Test.pyc'''
出现如下错误
Traceback (most recent call last):
File "D:\A\B/Test.py", line 43, in <module>
from GL import GL
ModuleNotFoundError: No module named 'Gl'
原因就是GL.py没有转成Gl.pyc文件。
将Gl.py转换后,执行命令,
'''
D:\A\B\__pycache__>python Test.pyc
Element Delta h Max error Rate50.21.658E-03100.14.338E-041.93467200.051.080E-042.00643400.0252.697E-052.00143800.01256.747E-061.99889
D:\A\B\__pycache__>