5

我需要发布一个 Python 脚本的编译版本,并且能够证明(使用哈希)编译的文件确实与原始文件相同。

到目前为止,我们使用的是一个简单的:

find . -name "*.py" -print0 | xargs -0 python2 -m py_compile

问题是这是不可重现的(不确定波动因素是什么,但 2 次执行不会给我们相同的 .pyc 相同的 python 文件)并迫使我们始终发布相同的编译版本,而不是仅仅给出构建脚本给任何人以生成新的编译版本。

有没有办法做到这一点?

谢谢

4

2 回答 2

9

编译的 Python 文件包括一个四字节的幻数和四字节的编译日期时间。这可能解释了您所看到的差异。

如果您在校验和过程中省略了字节 5-8,那么您应该会看到给定 Python 版本的常量校验和。

该文件的格式在Ned Batchelder的这篇博.pyc文中给出。

于 2016-09-13T14:19:07.970 回答
4

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。

于 2019-11-21T20:38:33.410 回答