为了账号安全,请及时绑定邮箱和手机立即绑定

什么是错误的魔数错误?

什么是错误的魔数错误?

HUX布斯 2019-07-24 09:55:33
什么是错误的魔数错误?什么是python中的“错误幻数”ImportError,我该如何解决?我在网上找到的唯一的东西表明这是由编译.py - > .pyc文件然后尝试使用错误版本的python引起的。然而,在我的情况下,文件似乎导入了一些细节而不是其他文件,我不知道为什么。回溯中提供的信息python并不是特别有用(这就是我在这里问的原因......),但是这里有以下情况:Traceback (most recent call last):   File "run.py", line 7, in <module>     from Normalization import Normalizer
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

神奇的数字来自UNIX类型的系统,其中文件的前几个字节持有指示文件类型的标记。


Python pyc在创建文件时会在其文件中添加类似的标记。


然后python解释器确保加载它时这个数字是正确的。


任何损害这个神奇数字的东西都会导致你的问题。这包括编辑pyc文件或尝试pyc从不同版本的python(通常是更晚版本)运行a 而不是解释器。


如果它们是您的 pyc文件,只需删除它们并让解释器重新编译py文件。在UNIX类型系统上,这可能是这样简单:


rm *.pyc

要么:


find . -name '*.pyc' -delete

如果它们不是你的,你将不得不获取py重新编译的文件,或者可以运行pyc具有该特定魔术值的文件的解释器。


可能导致间歇性的一件事。该pyc是造成该问题可能只在一定条件下进口。它有时不太可能导入。导入失败时应检查实际的完整堆栈跟踪?


顺便说一下,我所有2.5.1(r251:54863) pyc文件的第一个字是62131,2.6.1(r261:67517)是62161。所有魔术数字的列表都可以在Python/import.c这里找到,为了完整性而再现(当前发布的答案,从那时起它可能已经改变):


1.5:   20121

1.5.1: 20121

1.5.2: 20121

1.6:   50428

2.0:   50823

2.0.1: 50823

2.1:   60202

2.1.1: 60202

2.1.2: 60202

2.2:   60717

2.3a0: 62011

2.3a0: 62021

2.3a0: 62011

2.4a0: 62041

2.4a3: 62051

2.4b1: 62061

2.5a0: 62071

2.5a0: 62081

2.5a0: 62091

2.5a0: 62092

2.5b3: 62101

2.5b3: 62111

2.5c1: 62121

2.5c2: 62131

2.6a0: 62151

2.6a1: 62161

2.7a0: 62171


查看完整回答
反对 回复 2019-07-24
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

删除所有.pyc文件将修复“Bad Magic Number”错误。

find . -name "*.pyc" -delete


查看完整回答
反对 回复 2019-07-24
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

将pyc文件带到Windows机器上。使用任何十六进制编辑器打开此pyc文件。我用过免费软件'HexEdit'。现在读取前两个字节的十六进制值。就我而言,这些是03 f3。

打开calc并将其显示模式转换为Programmer(XP中的Scientific)以查看十六进制和十进制转换。从单选按钮中选择“十六进制”。首先输入值作为第二个字节,然后输入第一个字节,即f303现在单击“Dec”(十进制)单选按钮。显示的值是对应于魔术数字aka python版本的值。

所以,考虑前面回复中提供的表格

  • 1.5 => 20121 => 4E99因此文件的第一个字节为99,第二个为4e

  • 1.6 => 50428 => C4FC所以文件的第一个字节为fc,第二个字节为c4


查看完整回答
反对 回复 2019-07-24
  • 3 回答
  • 0 关注
  • 808 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信