Как сделать компиляцию python исходного кода воспроизводимой - PullRequest
2 голосов
/ 05 августа 2020

После установки jsonpickle на моем компьютере (pip install jsonpickle == 1.4.1 --no-compile) я заметил, что компиляция файла pandas.py во вложенной папке ext не всегда воспроизводима.

В подпапке ext я выполнил следующий код bash для компиляции всех .py файлов в .pyc файлы:

python -m compileall -d somereldir --invalidation-mode checked-hash

это создало pandas.cpython-37.pyc в подкаталоге __pycache__. Затем в подкаталоге __pycache__ я выполнил: xxd pandas.cpython-37.pyc > hex1.hex

Если я снова сделаю вышеупомянутые шаги и запишу шестнадцатеричный дамп в hex2.hex, я заметил, что есть две несовпадающие строки.

diff hex1.hex hex2.hex
288,289c288,289
< 000011f0: 0029 013e 0200 0000 723f 0000 00da 056e  .).>....r?.....n
< 00001200: 616d 6573 7213 0000 0029 0372 3300 0000  amesr....).r3...
---
> 000011f0: 0029 013e 0200 0000 da05 6e61 6d65 7372  .).>......namesr
> 00001200: 3f00 0000 7213 0000 0029 0372 3300 0000  ?...r....).r3...

Я выполнил это несколько раз и оказалось, что есть две «версии» файла .pyc, иногда они совпадают, иногда нет.

Из-за этого у меня несколько вопросов:

  1. Почему есть разница в файлах .pyc?
  2. Как я могу убедиться, что скомпилированный файл .pyc всегда один и тот же.
  3. Я проверил некоторые другие python библиотеки, и все они дали воспроизводимые .pyc файлы, так что же отличается от этого pandas.py файла?

1 Ответ

2 голосов
/ 05 августа 2020

После разделения файла pandas.py на более мелкие части и их компиляции, я смог определить местонахождение проблемы в строке 135:

name_bundle = {k: v for k, v в meta.items (), если k in {'name', 'names'}}

, который отвечает на вопросы:

  1. строка 135 содержит набор ({'name','names'}). Порядок элементов в наборе не обязательно сохраняется после компиляции. Хотя словари сохраняют порядок вставки начиная с Python 3.7 , я не смог найти ничего о сохранении порядка элементов в наборах для Python 3.7.
  2. Установите для переменной среды PYTHONHASHSEED фиксированное значение значение.
  3. Возможно, эти библиотеки не содержат никакого набора.
...