3

在我的机器上安装 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

如果我再次执行上述步骤并将 hexdump 写入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文件有什么不同呢?
4

1 回答 1

3

在将pandas.py文件拆分为较小的部分并编译后,我能够在第 135 行确定问题的位置:

name_bundle = {k: v for k, v in meta.items() if k in {'name', 'names'}}

它回答了以下问题:

  1. 第 135 行包含一个集合 ( {'name','names'})。编译后不一定保留集合中元素的顺序。尽管字典保留了 Python 3.7 的插入顺序,但我找不到任何关于 Python 3.7 集合中元素的顺序保留的信息。
  2. 将环境变量 PYTHONHASHSEED 设置为固定值。
  3. 这些库可能不包含任何集合。
于 2020-08-05T19:16:42.373 回答