为什么使用compileall模块生成或运行时生成的.pyc文件不同?

2024-06-16 13:06:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试投资python缓存系统。并希望在生成.pyc文件后验证其哈希值。你知道吗

.pyc文件有3个字段:第0-4字节是幻数,第5-8字节是时间戳,第9个结束字节是封送对象。 我做了一些实验,可以看出同一个.pyc文件的.py与python的确切版本是相等的(不包括时间戳),并且独立于操作系统或体系结构(Intel、ARM)。你知道吗

如果我删除{u pycache}目录并运行.py文件,我将得到相同的.pyc文件。但是如果我运行$ python3 -m compileall ./ 我将得到一个简短而不同的.pyc文件。你知道吗

#   demo.py
print('importing inc')
import inc
#   inc.py
print('inc Module Loaded')
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ rm -R __pycache__/
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ python3 demo.py 
importing inc
inc Module Loaded
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ hexdump ./__pycache__/inc.cpython-36.pyc
0000000 0d33 0a0d 96d0 5cef 0027 0000 00e3 0000
0000010 0000 0000 0000 0000 0200 0000 4000 0000
0000020 7300 000c 0000 0065 0064 0183 0001 0164
0000030 0053 0229 117a 6e69 2063 6f4d 7564 656c
0000040 4c20 616f 6564 4e64 0129 05da 7270 6e69
0000050 a974 7200 0002 0000 0272 0000 fa00 2f33
0000060 6f68 656d 662f 6f72 6b69 2f65 614b 6172
0000070 626d 2f61 6373 6972 7470 7673 6c61 6469
0000080 7461 726f 702d 7479 6f68 2f6e 6e69 2e63
0000090 7970 08da 6d3c 646f 6c75 3e65 0003 0000
00000a0 0073 0000 0000                         
00000a5
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ rm -R __pycache__/
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ python3 demo.py 
importing inc
inc Module Loaded
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ hexdump ./__pycache__/inc.cpython-36.pyc
0000000 0d33 0a0d 96d0 5cef 0027 0000 00e3 0000
0000010 0000 0000 0000 0000 0200 0000 4000 0000
0000020 7300 000c 0000 0065 0064 0183 0001 0164
0000030 0053 0229 117a 6e69 2063 6f4d 7564 656c
0000040 4c20 616f 6564 4e64 0129 05da 7270 6e69
0000050 a974 7200 0002 0000 0272 0000 fa00 2f33
0000060 6f68 656d 662f 6f72 6b69 2f65 614b 6172
0000070 626d 2f61 6373 6972 7470 7673 6c61 6469
0000080 7461 726f 702d 7479 6f68 2f6e 6e69 2e63
0000090 7970 08da 6d3c 646f 6c75 3e65 0003 0000
00000a0 0073 0000 0000                         
00000a5
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ rm -R __pycache__/
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ python3 -m compileall inc.py
Compiling 'inc.py'...
froike@laptop-roi-x260:~/Pakpaka/scriptsvalidator-python$ hexdump ./__pycache__/inc.cpython-36.pyc 
0000000 0d33 0a0d 96d0 5cef 0027 0000 00e3 0000
0000010 0000 0000 0000 0000 0200 0000 4000 0000
0000020 7300 000c 0000 0065 0064 0183 0001 0164
0000030 0053 0229 117a 6e69 2063 6f4d 7564 656c
0000040 4c20 616f 6564 4e64 0129 05da 7270 6e69
0000050 a974 7200 0002 0000 0272 0000 fa00 6906
0000060 636e 702e da79 3c08 6f6d 7564 656c 033e
0000070 0000 7300 0000 0000                    
0000078

有什么方法可以使用compileall模块获得与运行时相同的.pyc文件?

谢谢!你知道吗


Tags: 文件py字节demopython3incpycpycache