当前位置:  开发笔记 > 编程语言 > 正文

什么是错误的魔数错误?

如何解决《什么是错误的魔数错误?》经验,为你挑选了4个好方法。

什么是python中的"错误幻数"ImportError,我该如何解决?

我在网上找到的唯一的东西表明这是由编译.py - > .pyc文件然后尝试使用错误版本的python引起的.然而,在我的情况下,文件似乎导入了一些细节而不是其他文件,我不知道为什么.

回溯中提供的信息python并不是特别有用(这就是我在这里问的原因......),但是这里有以下情况:

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

paxdiablo.. 368

神奇的数字来自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

谢谢 - 这并没有直接帮助我弄清楚我的问题,但不管怎样我很高兴知道答案! (2认同)


akarca.. 57

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

find . -name "*.pyc" -delete

IMO这是一个非常危险的剧本.如果一个包只与.pyc文件一起交付以保持其封闭源怎么办?糟糕,您刚刚删除了该应用程序. (22认同)

@DanMantyla封闭的源代码包无论如何都应该删除. (9认同)

使用`find可能更好.-name"*.pyc"-delete`,因为如果扩展所有文件名以传递给`rm`,你将遇到空格问题(可能还有一个命令行太长). (8认同)

可能最好先运行`find.-name"*.pyc"-print`然后在验证您没有做出令人遗憾的事情后,手动删除有问题的文件,和/或运行上面的命令. (3认同)


jtm.. 20

*.pyc使用python2 加载python3生成的文件也会导致此错误.



1> paxdiablo..:

神奇的数字来自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


谢谢 - 这并没有直接帮助我弄清楚我的问题,但不管怎样我很高兴知道答案!

2> akarca..:

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

find . -name "*.pyc" -delete


IMO这是一个非常危险的剧本.如果一个包只与.pyc文件一起交付以保持其封闭源怎么办?糟糕,您刚刚删除了该应用程序.
@DanMantyla封闭的源代码包无论如何都应该删除.
使用`find可能更好.-name"*.pyc"-delete`,因为如果扩展所有文件名以传递给`rm`,你将遇到空格问题(可能还有一个命令行太长).
可能最好先运行`find.-name"*.pyc"-print`然后在验证您没有做出令人遗憾的事情后,手动删除有问题的文件,和/或运行上面的命令.

3> jtm..:

*.pyc使用python2 加载python3生成的文件也会导致此错误.


这可能是评论,而不是答案.

4> 小智..:

将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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有