Почему файл .pyc, который генерируется с использованием модуля compileall или генерируется, когда среда выполнения отличается? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь инвестировать в систему кэширования Python.и хотите проверить хэши файла .pyc после его генерации. Файлы

.pyc имеют 3 поля: 0-4-й байт - магическое число, 5-8-й байт - отметка времени, 9-й байт -маршалированный объект.Я провел несколько экспериментов и могу сказать, что .pyc того же файла .py с точной версией python равен (исключая временную метку) и не зависит от ОС или архитектуры (Intel, ARM).

Если я удаляю каталог __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 файлы, что и во время выполнения?

Спасибо!

...