Python+pyc文件编译和运行

 有时候在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          Rate
     5               0.2           1.658E-03
    10               0.1           4.338E-04         1.93467
    20              0.05           1.080E-04         2.00643
    40             0.025           2.697E-05         2.00143
    80            0.0125           6.747E-06         1.99889

D:\A\B\__pycache__>
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值