什么是不可思议的数字错误?

Python中的“坏幻数”ImportError是什么,我该如何解决?

我唯一能在网上find的build议是编译一个.py – > .pyc文件,然后试图用错误版本的python来使用它。 但是,在我的情况下,该文件似乎有些时候导入罚款,但不是其他人,我不知道为什么。

python在回溯中提供的信息并不是特别有用(这就是为什么我在这里要求…),但是在这里它有助于:

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

神奇数字来自UNIXtypes的系统,其中文件的前几个字节持有指示文件types的标记。

Python在创buildpyc文件时会将相似的标记放入pyc文件中。

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

任何损害这个神奇数字的东西都会导致你的问题。 这包括编辑pyc文件或试图从不同版本的python(通常在后面)运行一个pyc比解释器。

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

 rm *.pyc 

要么:

 find . -name '*.pyc' -delete 

如果他们不是你的,你必须得到py文件来重新编译,或者是一个可以运行pyc文件的解释器。

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

另外,我所有的2.5.1(r251:54863) pyc文件的第一个单词是62131 2.6.1(r261:67517)62161 。 所有幻数的列表可以在Python/import.cfind,在这里为了完整而复制(当前答案发布的时间,从那时起可能已经改变了):

 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 

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

把pyc文件放到一台windows机器上。 使用任何hex编辑器来打开这个pyc文件。 我使用免费的'HexEdit'。 现在读取前两个字节的hex值。 就我而言,这些是03 f3。

打开calc并将其显示模式转换为Programmer(Scientific in XP)以查看hex和十进制转换。 从单选buttonselect“hex”。 先input值作为第二个字节,然后第一个字节,即f303现在点击“Dec”(十进制)单选button。 所显示的值是对应于python的幻数aka版本的值。

所以,考虑一下在前面的答复中提供的表格

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

使用非常旧的(1.5.2)实现,我遇到了一个奇怪的Bad Magic Number错误。 我生成了一个.pyo文件,并触发了错误。 奇怪的是,通过更改模块的名称解决了问题。 有问题的名字是sms.py。 如果我从该模块生成一个sms.pyo,坏的幻数是错误的结果。 当我将名称更改为smst.py时,错误消失了。 我来回查看,看看sms.py以某种方式干扰任何其他模块具有相同的名称,但我找不到任何名称的冲突。 即使这个问题的来源对我来说仍然是一个谜,我build议尝试一个模块名称的改变。

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

在你的git,svn或复制文件夹中find一个可用的版本。

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

这对我有用。

这比上面更有效率。

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

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

在我的情况下,它不是.pyc但我重命名我自己的模块后,旧的二进制.mo翻译文件,所以在这个模块文件夹,我不得不运行

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

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

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

我只是遇到了与Fedora26相同的问题,因为dnf等很多工具因为6个坏的魔法数而被破坏。 由于一个未知的原因,我有一个文件/usr/bin/six.pyc,与意想不到的幻数。 删除这个文件解决了这个问题