什么是不可思议的数字错误?
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.c
find,在这里为了完整而复制(当前答案发布的时间,从那时起可能已经改变了):
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,与意想不到的幻数。 删除这个文件解决了这个问题