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

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

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

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

当前回答

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

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

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

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

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

rm *.pyc

or:

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

其他回答

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

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

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

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

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

rm *.pyc

or:

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

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

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

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

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

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

find . -name "*.pyc" -delete