可重复的python构建

时间:2016-09-13 13:59:12

标签: python binary-reproducibility

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

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

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

问题在于这是不可重复的(不确定什么是波动因素,但是2次执行不会给同一个python文件提供相同的.pyc)并迫使我们总是运送相同的编译版本而不是能够只需将构建脚本提供给任何人来生成新的编译版本。

有没有办法实现这个目标?

由于

2 个答案:

答案 0 :(得分:9)

编译的Python文件包含一个四字节幻数和四字节编译日期时间。这可能是您所看到的差异的原因。

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

.pyc文件的格式由Ned Batchelder在this blog post中提供。

答案 1 :(得分:0)

2019年/ python3.7 +更新:自PEP 552

public class MultipleChoiceQuestion : Question, IAnswerable<MultipleChoiceAnswer>, INotifyPropertyChanged
{
    public MultipleChoiceQuestion(string contents, Questionnaire questionnaire) : base(contents, questionnaire) 
    {
    }
    public MultipleChoiceQuestion() : base() {
        Options = new ObservableCollection<string>();
    }

    public override GraphType GraphType => GraphType.Pie;
    public new virtual ICollection<MultipleChoiceAnswer> Answers { get; set; }
    public ICollection<string> Options { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

将创建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 ,直到它们的源代码更改后,它们才会更改。