什么是坏的幻数错误?

新手上路,请多包涵

python 中的“Bad magic number”ImportError 是什么,我该如何解决?

我唯一能在网上找到的东西表明这是由编译 .py -> .pyc 文件然后尝试将其与错误版本的 python 一起使用引起的。但是,就我而言,该文件有时似乎可以正常导入,但有时却不行,我不确定为什么。

python 在回溯中提供的信息并不是特别有用(这就是我在这里问的原因……),但这里是为了以防万一它有帮助:

 Traceback (most recent call last):
  File "run.py", line 7, in <module>
    from Normalization import Normalizer

原文由 Noah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 588
2 个回答

幻数来自 UNIX 类型的系统,其中文件的前几个字节包含指示文件类型的标记。

Python 在创建文件时将类似的标记放入其 pyc 文件中。

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

任何破坏这个神奇数字的东西都会导致你的问题。这包括编辑 pyc 文件或尝试运行 pyc 来自与您的解释器不同版本的 python(通常更高版本)。

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

 rm *.pyc

要么:

 find . -name '*.pyc' -delete

如果它们不是您的,则您必须获取 py 文件以进行重新编译,或者获取可以运行 pyc 具有特定魔法值的文件的解释器。

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

As an aside, the first word of all my 2.5.1(r251:54863) pyc files is 62131 , 2.6.1(r261:67517) is 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

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 find . -name "*.pyc" -delete

原文由 akarca 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏