首页 文章

什么是错误的魔数错误?

提问于
浏览
257

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

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

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

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

12 回答

  • 1

    这比上面的效率要高得多 .

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

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

  • 1

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

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

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

  • 0

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

  • 0

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

  • 48

    神奇的数字来自UNIX类型的系统,其中文件的前几个字节持有指示文件类型的标记 .

    Python在创建它们时会在其 pyc 文件中添加类似的标记 .

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

    任何损害这个神奇数字的东西都会导致你的问题 . 这包括编辑 pyc 文件或尝试从不同版本的python(通常更晚)运行 pyc 而不是解释器 .

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

    rm *.pyc
    

    要么:

    find . -name '*.pyc' -delete
    

    如果它们不属于您,则必须获取 py 文件以进行重新编译,或者使用能够运行具有该特定魔术值的 pyc 文件的解释器 .

    可能导致间歇性的一件事 . pyc ,它有时不太可能进口's causing the problem may only be imported under certain conditions. It' . 导入失败时应检查实际的完整堆栈跟踪?

    顺便说一下,我所有 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
    
  • 17

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

    find . -name "*.pyc" -delete
    
  • 315

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

  • 0

    将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

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

  • 6

    如果您使用扩展名.pyc手动命名文件,也会出现“错误的幻数”错误

  • 0

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

  • 0

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

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

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

    这对我有用 .

相关问题