Python 3.5.0 给出了一个意外的幻数
Python 3.5.0 gives an unexpected magic number
以下代码是线性方程求解器的一部分。它是为 python 3 编写的。在 运行 程序之前,它会根据预期值检查 imp.get_magic()
中的幻数。
我在系统 运行ning 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. It can be found under the section "The Matrix" and the file is named solver.py
(文件直接下载)
有没有办法让它滚动?
每次字节码更改时都会更新幻数,以确保您不会尝试将向后不兼容的字节码加载到较旧的解释器中。
代码查找的特定魔术标记是 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()
,并且发现 字节码 .
没有真正的区别
以下代码是线性方程求解器的一部分。它是为 python 3 编写的。在 运行 程序之前,它会根据预期值检查 imp.get_magic()
中的幻数。
我在系统 运行ning 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. It can be found under the section "The Matrix" and the file is named solver.py
(文件直接下载)
有没有办法让它滚动?
每次字节码更改时都会更新幻数,以确保您不会尝试将向后不兼容的字节码加载到较旧的解释器中。
代码查找的特定魔术标记是 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()
,并且发现 字节码 .