Python 3.5.0提供了一个意想不到的幻数

时间:2017-05-01 08:19:39

标签: python linux python-3.x fedora fedora-25

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

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

预期为:b'\xf8\x0c\r\n'

相反,我得到:b'\x16\r\r\n'

这是代码

def _get_module():
    del globals()['_get_module']
    import imp
    import base64
    import marshal

    magic = imp.get_magic()
    if magic == b'\xf8\x0c\r\n': # Python 3.5
      pycData = <certain value>
    pycData = base64.decodebytes(pycData)

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

此代码来自本书Coding the Matrix的资源。它可以在&#34; The Matrix&#34;部分找到。并且文件名为solver.py(文件直接下载)。

有没有办法让这种滚动?

1 个答案:

答案 0 :(得分:2)

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

代码寻找的特定魔术标记是Python 3.5a0的标记,请参阅changelog for markers

>>> int.from_bytes(b'\xf8\x0c', 'little')
3320

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

>>> int.from_bytes(b'\x16\r', 'little')
3350

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

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