python 中的可重现构建
Reproducible builds in python
我需要发布 python 脚本的编译版本,并能够证明(使用散列)编译文件确实与原始文件相同。
到目前为止我们使用的是一个简单的:
find . -name "*.py" -print0 | xargs -0 python2 -m py_compile
问题是这是不可重现的(不确定波动因素是什么,但两次执行不会为相同的 python 文件提供相同的 .pyc)并迫使我们始终发送相同的文件编译版本,而不是只能将构建脚本提供给任何人以生成新的编译版本。
有办法实现吗?
谢谢
已编译的 Python 文件包含一个四字节的幻数和四字节的编译日期时间。这可能是您看到的差异的原因。
如果您在校验和过程中省略了字节 5-8,那么您应该会看到给定版本 Python 的常量校验和。
Ned Batchelder 在 this blog post 中给出了 .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,在其源代码更改之前不会更改。
我需要发布 python 脚本的编译版本,并能够证明(使用散列)编译文件确实与原始文件相同。
到目前为止我们使用的是一个简单的:
find . -name "*.py" -print0 | xargs -0 python2 -m py_compile
问题是这是不可重现的(不确定波动因素是什么,但两次执行不会为相同的 python 文件提供相同的 .pyc)并迫使我们始终发送相同的文件编译版本,而不是只能将构建脚本提供给任何人以生成新的编译版本。
有办法实现吗?
谢谢
已编译的 Python 文件包含一个四字节的幻数和四字节的编译日期时间。这可能是您看到的差异的原因。
如果您在校验和过程中省略了字节 5-8,那么您应该会看到给定版本 Python 的常量校验和。
Ned Batchelder 在 this blog post 中给出了 .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,在其源代码更改之前不会更改。