0

以下代码是线性方程求解器的一部分。它是为 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一书的资源。它可以在“矩阵”部分下找到,并且文件被命名solver.py(文件直接下载)。

有没有办法让这个滚动?

4

1 回答 1

2

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

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

>>> 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()在每个版本上运行,发现bytecode 没有真正的差异

于 2017-05-01T08:39:59.050 回答