Воспроизводимые сборки в 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

будет создавать .pycs, которые не изменятся, пока не изменится их исходный код.

Другие вопросы по тегам