坏魔数错误是什么?

什么是“坏魔法数字”ImportError在python,我如何解决它?

我能在网上找到的唯一一件事表明,这是由编译一个.py -> .pyc文件引起的,然后试图使用错误版本的python。然而,在我的例子中,文件有时似乎导入得很好,但有时却不行,我不知道为什么。

python在回溯中提供的信息不是特别有用(这就是为什么我在这里问…),但如果它有帮助的话,它在这里:

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

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

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

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

任何破坏这个神奇数字的东西都会给你带来麻烦。这包括编辑pyc文件或尝试从不同版本的python(通常较晚)运行pyc

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

rm *.pyc

或者:

find . -name '*.pyc' -delete

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

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

顺便说一句,我的所有2.5.1(r251:54863) pyc文件的第一个单词是621312.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

删除所有.pyc文件将修复“坏魔术数字”错误。

find . -name "*.pyc" -delete

这比上面的方法更有效。

find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf

其中{directory-of-.pyc-files}是包含编译过的python文件的目录。

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

将pyc文件保存到windows计算机上。使用十六进制编辑器打开这个pyc文件。我使用免费软件“HexEdit”。现在读取前两个字节的十六进制值。在我的例子中,这些是03 f3。

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

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

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

在使用一个非常老的(1.5.2)实现时,我遇到了一个奇怪的Bad Magic Number错误案例。我生成了一个.pyo文件,触发了错误。奇怪的是,这个问题是通过更改模块的名称解决的。这个讨厌的名字是sms.py。如果我生成一条短信。pyo从该模块,坏魔术数字错误的结果。当我将名称更改为smst.py时,错误消失了。我反复检查了sms.py是否以某种方式干扰了其他具有相同名称的模块,但我找不到任何名称冲突。尽管这个问题的根源对我来说仍然是个谜,但我建议尝试更改模块名称。

在我的例子中,它不是.pyc,而是我重命名自己的模块后的旧二进制.mo翻译文件,所以在这个模块文件夹中我必须运行

find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \;

(请先备份并修复.pyc文件)

不要删除它们!!直到 ..........

在你的git, svn或复制文件夹中找到一个有效的版本。

删除它们,然后恢复所有的.pyc。

那是我的工作。

如果你有错误的python27.dll文件(在Windows的情况下),也会发生这种情况,要解决这个问题,只需重新安装(或提取)python与精确对应的dll版本。我也有过类似的经历。

我刚刚在Fedora26上遇到了同样的问题,由于6的魔法数字不好,许多工具(如dnf)都被破坏了。 由于一个未知的原因,我有一个文件/usr/bin/ 6。派克,带着意想不到的神奇数字。删除这个文件修复了问题

如果您手动以.pyc扩展名命名文件,也会发生“坏魔术数字”错误

这也可能是由于目录中缺少__init__.py文件。比如,如果你在Django中创建了一个新目录,用于将单元测试分离为多个文件,并将它们放在一个目录中,那么你还必须在新创建的测试目录中的所有其他文件旁边创建__init__.py文件。否则它会给出如下错误:

Traceback (most recent call last):
File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python35\Lib\unittest\loader.py",line 153, in loadTestsFromName
module = __import__(module_name)
ImportError: bad magic number in 'APPNAME.tests': b'\x03\xf3\r\n'

您需要在环境中的每个路径上运行此命令。

>>> import sys
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/source_code/src/python', '/usr/lib/python3/dist-packages']


然后在这里的每个目录下运行命令

find /usr/lib/python3.6/ -name "*.pyc" -delete
find /usr/local/lib/python3.6/dist-packages -name "*.pyc" -delete
# etc...

在我的例子中,我已经git clone了一个库,它有一个解释器

#!/usr/bin/env python

虽然我的主代码是用python3.6运行的,但python会导致Python2.7…它仍然为2.7版本创建了*.pyc文件…

我可以说这个错误可能是2.7 &3+版本,这就是为什么清理(以任何你能想到的你正在使用的方式)在这里会有帮助…

  • 别忘了调整那些Python2x代码-> python 3…

所以我有同样的错误:ImportError bad magic number。这是windows 10上的

这个错误是因为我安装了mysql-connector

所以我不得不:

pip uninstall mysql-comnector
pip uninstall mysql-connector-python
pip install mysql-connector-python