什么是错误的魔数错误?

时间:2009-02-05 02:59:47

标签: python

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

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

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

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

15 个答案:

答案 0 :(得分:342)

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

答案 1 :(得分:53)

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

find . -name "*.pyc" -delete

答案 2 :(得分:20)

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

答案 3 :(得分:6)

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

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

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

  • 1.5 =&gt; 20121 =&gt; 4E99所以文件的第一个字节为99,第二个为4e
  • 1.6 =&gt; 50428 =&gt; C4FC所以文件的第一个字节为fc,第二个字节为c4

答案 4 :(得分:2)

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

答案 5 :(得分:1)

我使用非常古老的(1.5.2)实现有一个奇怪的Bad Magic Number错误案例。我生成了一个.pyo文件并触发了错误。奇怪的是,通过更改模块的名称解决了问题。令人讨厌的名字是sms.py.如果我从该模块生成sms.pyo,则会导致Bad Magic Number错误。当我将名称更改为smst.py时,错误消失了。我来回检查sms.py是否以某种方式干扰了任何其他具有相同名称的模块,但我找不到任何名称冲突。即使这个问题的根源仍然是我的错误,我建议尝试更改模块名称。

答案 6 :(得分:1)

这也可能是由于目录中缺少__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'

答案 7 :(得分:0)

这比上面的效率更高。

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

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

答案 8 :(得分:0)

在我的情况下,在重命名我自己的模块后,它不是val logData = sc.textFile("path",2).map(item => {val comps=item.split(" "); (comps(6).toFloat, comps(8).toFloat)}) 而是旧的二进制.pyc翻译文件,因此在此模块文件夹中我必须运行

.mo

(请先备份然后尝试修复find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \; 个文件)

答案 9 :(得分:0)

如果你有错误的python27.dll文件(在Windows的情况下),这也可能发生,解决这个问题只需重新安装(或提取)python与完全相应的DLL版本。我有类似的经历。

答案 10 :(得分:0)

我刚刚遇到与Fedora26相同的问题,其中许多工具如dnf由于6个恶魔数而被打破。 由于一个未知的原因,我有一个文件/usr/bin/six.pyc,带有意想不到的幻数。删除此文件可解决问题

答案 11 :(得分:0)

您将需要在环境中的所有路径中运行此命令。

>>> 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...

答案 12 :(得分:0)

就我而言,我有git clone个具有

解释器的库。
#!/usr/bin/env python

尽管python导致Python2.7,即使我的主要代码运行在python3.6上,它仍为*.pyc版本创建了2.7文件。

我可以说这个错误可能是2.7和3+版本之间混合使用的结果,这就是为什么清理(以任何方式可以认为正在使用的方式)的原因-在这里会有所帮助...

  • 别忘了调整这些Python2x代码-> python 3 ...

答案 13 :(得分:0)

所以我有同样的错误:importError错误的魔术数字。这是在Windows 10上

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

所以我不得不; pip卸载mysql-comnector pip卸载mysql-connector-python

pip安装mysql-connector-python

答案 14 :(得分:-1)

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

在您的git,svn或copy文件夹中找到适用的版本。

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

那对我有用。