Воспроизводимые сборки в Python
Мне нужно отправить скомпилированную версию скрипта Python и иметь возможность доказать (используя хеш), что скомпилированный файл действительно такой же, как и исходный.
То, что мы используем до сих пор, является простым:
find . -name "*.py" -print0 | xargs -0 python2 -m py_compile
Проблема в том, что это не воспроизводимо (не знаю, каковы флуктуирующие факторы, но 2 выполнения не дадут нам одинаковый.pyc для одного и того же файла Python) и заставляет нас всегда отправлять одну и ту же скомпилированную версию вместо возможности просто дать скрипт сборки для любого, кто создаст новую скомпилированную версию.
Есть ли способ достичь этого?
Спасибо
1 ответ
Скомпилированные файлы Python содержат четырехбайтовое магическое число и четырехбайтовую дату и время компиляции. Это, вероятно, объясняет расхождения, которые вы видите.
Если вы пропустите байты 5-8 в процессе проверки контрольных сумм, то вы должны увидеть постоянные контрольные суммы для данной версии Python.
Формат .pyc
файл предоставлен в этом сообщении в блоге Недом Бэтчелдером.
2019 / python3.7+ обновление: с PEP 552
python -m compileall -f --invalidation-mode=checked-hash [file|dir]
# or
export SOURCE_DATE_EPOCH=1 # set py_compile to use
python -m py_compile # pycompile.PycInvalidationMode.CHECKED_HASH
будет создавать .pyc
s, которые не изменятся, пока не изменится их исходный код.