什么是python中的“错误幻数”ImportError,我该如何解决?
我在网上找到的唯一的东西表明这是由编译.py - > .pyc文件然后尝试使用错误版本的python引起的 . 然而,在我的情况下,文件似乎导入了一些细节而不是其他文件,我不知道为什么 .
回溯中提供的信息python并不是特别有用(这就是我在这里问的原因......),但这里有以下情况:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
12 回答
这比上面的效率要高得多 .
其中
{directory-of-.pyc-files}
是包含已编译的python文件的目录 .在我的情况下,重命名我自己的模块后,它不是
.pyc
但是旧的二进制.mo
翻译文件,所以在这个模块文件夹里我不得不运行(请先备份并尝试先修复
.pyc
文件)如果你有错误的python27.dll文件(在Windows的情况下),这也可能发生,解决这个问题只需重新安装(或提取)python与完全相应的DLL版本 . 我有类似的经历 .
我刚刚遇到了与Fedora26相同的问题,其中许多工具如dnf由于6的恶魔数而被打破 . 由于一个未知的原因,我有一个文件/usr/bin/six.pyc,带有意想不到的幻数 . 删除此文件可解决此问题
神奇的数字来自UNIX类型的系统,其中文件的前几个字节持有指示文件类型的标记 .
Python在创建它们时会在其
pyc
文件中添加类似的标记 .然后python解释器确保加载它时这个数字是正确的 .
任何损害这个神奇数字的东西都会导致你的问题 . 这包括编辑
pyc
文件或尝试从不同版本的python(通常更晚)运行pyc
而不是解释器 .如果它们是您的
pyc
文件,只需删除它们并让解释器重新编译py
文件 . 在UNIX类型系统上,这可能是这样简单:要么:
如果它们不属于您,则必须获取
py
文件以进行重新编译,或者使用能够运行具有该特定魔术值的pyc
文件的解释器 .可能导致间歇性的一件事 .
pyc
,它有时不太可能进口's causing the problem may only be imported under certain conditions. It' . 导入失败时应检查实际的完整堆栈跟踪?顺便说一下,我所有
2.5.1(r251:54863)
pyc
文件的第一个字是62131
,2.6.1(r261:67517)
是62161
. 所有幻数的列表都可以在Python/import.c
中找到,这里为了完整性而再现(当前答案被发布时,它可能已经改变了):删除所有.pyc文件将修复“Bad Magic Number”错误 .
使用python2加载python3生成的
*.pyc
文件也会导致此错误 .将pyc文件带到Windows机器上 . 使用任何十六进制编辑器打开此pyc文件 . 我用过免费软件'HexEdit' . 现在读取前两个字节的十六进制值 . 就我而言,这些是03 f3 .
打开calc并将其显示模式转换为Programmer(XP中的Scientific)以查看十六进制和十进制转换 . 从单选按钮中选择“十六进制” . 首先输入值作为第二个字节然后输入第一个字节,即f303现在单击“Dec”(十进制)单选按钮 . 显示的值是对应于魔术数字aka python版本的值 .
所以,考虑前面回复中提供的表格
1.5 => 20121 => 4E99因此文件的第一个字节为99,第二个为4e
1.6 => 50428 => C4FC所以文件的第一个字节为fc,第二个字节为c4
我使用非常古老的(1.5.2)实现有一个奇怪的Bad Magic Number错误案例 . 我生成了一个.pyo文件并触发了错误 . 奇怪的是,通过更改模块的名称来解决问题 . 令人讨厌的名字是sms.py.如果我从该模块生成sms.pyo,则会导致Bad Magic Number错误 . 当我将名称更改为smst.py时,错误消失了 . 我来回检查sms.py是否以某种方式干扰了任何其他具有相同名称的模块,但我找不到任何名称冲突 . 即使这个问题的根源对我来说仍然是个谜,我建议尝试更改模块名称 .
如果您使用扩展名.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'
不要删除它们!直到..........
在您的git,svn或copy文件夹上找到适用的版本 .
删除它们然后恢复所有.pyc .
这对我有用 .