Python 3.5.0给出了一个意想不到的神奇数字



以下代码是线性方程求解器的一部分。它是为 python 3 编写的。在运行程序之前,它会根据预期值检查imp.get_magic()中的幻数。

我在运行Fedora 25的系统上安装了Python 3.5.0。 问题是,在我的系统上,我得到了一个不同的幻数值。

预期为 :b'xf8x0crn'

相反,我得到:b'x16rrn'

这是代码

def _get_module():
del globals()['_get_module']
import imp
import base64
import marshal
magic = imp.get_magic()
if magic == b'xf8x0crn': # Python 3.5
pycData = <certain value>
pycData = base64.decodebytes(pycData)

由于我得到的幻数值不同,因此无法运行此程序。

此代码来自《编码矩阵》一书的资源。它可以在"矩阵"部分下找到,文件名为solver.py(文件直接下载)。

有没有办法让这个滚动?

每次字节码更改时,幻数都会更新,以确保您不会尝试将向后不兼容的字节码加载到较旧的解释器中。

代码查找的特定魔术标记是 Python 3.5a0 的标记,请参阅标记的更新日志:

>>> int.from_bytes(b'xf8x0c', 'little')
3320

当您尝试使用 3.5b2 或更高版本(但在 3.5.2 之前)加载它时:

>>> int.from_bytes(b'x16r', 'little')
3350

您可以将该版本加载到 3.5.2 中;只需禁用魔术标记测试或返工代码以提取标记(就像我上面所做的那样,前两个字节)并匹配最大可能的值。

但是,我不确定为什么该代码首先不只是分发.pyc文件。Python 3.3字节码可以很好地加载到Python 3.6中。 我已经将所有版本加载到 Python 3.6 中,在每个版本上运行dis.dis(),发现字节码没有真正的差异

相关内容

  • 没有找到相关文章

最新更新