什么是糟糕的魔法数字错误?
- 2025-01-15 08:45:00
- admin 原创
- 79
问题描述:
python 中的“糟糕的魔法数字”ImportError 是什么,我该如何修复它?
我在网上找到的唯一信息表明,这是由于编译了 .py -> .pyc 文件,然后尝试将其与错误版本的 python 一起使用而导致的。但是,就我而言,该文件有时似乎可以正常导入,但有时却不行,我不确定原因。
python 在回溯中提供的信息并不是特别有用(这就是我在这里询问的原因......),但万一有帮助的话,这里提供一下:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
解决方案 1:
这个神奇的数字来自于 UNIX 类型的系统,其中文件的前几个字节包含指示文件类型的标记。
pyc
Python在创建文件时也会将类似的标记放入其中。
然后,python 解释器在加载时确保这个数字是正确的。
任何破坏此魔法数字的行为都会导致问题。这包括编辑文件或尝试从不同于您的解释器的 Python 版本(通常更高)pyc
运行。pyc
如果它们是您的 pyc
文件(或者您有py
它们的文件),只需删除它们并让解释器重新编译这些py
文件即可。在 UNIX 类型的系统上,这可能很简单,例如:
rm *.pyc
或者:
find . -name '*.pyc' -delete
如果它们不是您的,并且py
没有提供原始文件,您必须获取文件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
解决方案 2:
删除所有 .pyc 文件将修复“糟糕的魔法数字”错误。
find . -name "*.pyc" -delete
解决方案 3:
使用 python2加载 python3 生成的*.pyc
文件也会导致此错误。
解决方案 4:
将 pyc 文件带到 Windows 机器上。使用任何十六进制编辑器打开此 pyc 文件。我使用了免费软件“HexEdit”。现在读取前两个字节的十六进制值。在我的情况下,这些是 03 f3。
打开 calc 并将其显示模式转换为程序员(XP 中的科学型)以查看十六进制和十进制转换。从单选按钮中选择“十六进制”。首先输入第二个字节的值,然后输入第一个字节,即 f303 现在单击“Dec”(十进制)单选按钮。显示的值与魔法数字(即 Python 版本)相对应。
因此,考虑到之前回复中提供的表格
1.5 => 20121 => 4E99 因此文件的第一个字节为 99,第二个字节为 4e
1.6 => 50428 => C4FC 因此文件的第一个字节为 fc,第二个字节为 c4
解决方案 5:
这也可能是由于__init__.py
目录中缺少文件。假设您在 Django 中创建一个新目录,将单元测试分成多个文件并将它们放在一个目录中,那么您还必须__init__.py
在新建的测试目录中的所有其他文件旁边创建该文件。否则可能会出现如下错误:
Traceback (most recent call last):
File "C:UsersUSERNAMEAppDataLocalProgramsPythonPython35Lib/unittestloader.py",line 153, in loadTestsFromName
module = __import__(module_name)
ImportError: bad magic number in 'APPNAME.tests': b'x03xf3
'
解决方案 6:
在我的情况下,在我重命名自己的模块后,它不再是.pyc
旧的二进制.mo
翻译文件,因此在这个模块文件夹中,我必须运行
find . -name *.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' ;
(请先备份并尝试修复.pyc
文件)
解决方案 7:
如果您手动将文件命名为 .pyc 扩展名,也会出现“错误的魔法数字”错误
解决方案 8:
我在使用非常旧的 (1.5.2) 实现时遇到了奇怪的 Bad Magic Number 错误。我生成了一个 .pyo 文件,并触发了错误。奇怪的是,通过更改模块名称解决了这个问题。有问题的名称是 sms.py。如果我从该模块生成 sms.pyo,就会出现 Bad Magic Number 错误。当我将名称更改为 smst.py 时,错误消失了。我反复检查 sms.py 是否以某种方式干扰了其他同名模块,但我没有发现任何名称冲突。尽管这个问题的根源对我来说仍然是个谜,但我建议尝试更改模块名称。
解决方案 9:
这比上面的效率高得多。
find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf
{directory-of-.pyc-files}
包含已编译的 python 文件的目录在哪里。
解决方案 10:
如果您有错误的 python27.dll 文件(在 Windows 中),也会出现这种情况,要解决这个问题,只需重新安装(或提取)具有完全对应 dll 版本的 python。我也有类似的经历。
解决方案 11:
我刚刚在 Fedora26 上遇到了同样的问题,许多工具(例如 dnf)由于六的魔法数字错误而无法使用。由于未知原因,我得到了一个文件 /usr/bin/six.pyc,其中包含意外的魔法数字。删除此文件可解决问题
解决方案 12:
您需要在您环境的每个路径中运行此命令。
>>> 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...
解决方案 13:
在我的例子中,我有git clone
一个库,它有一个解释器
#!/usr/bin/env python
尽管我的主要代码是使用 python3.6 运行的......它仍然为版本创建了python
一个文件...Python2.7
`*.pyc`2.7
我可以说这个错误可能是 2.7 版和 3.0 版混合使用的结果,这就是为什么清理(以任何你能想到的方式使用)会在这里有所帮助......
不要忘记调整那些 Python2x 代码 -> python 3...
解决方案 14:
所以我遇到了同样的错误:ImportError bad magic number
。这是在 Windows 10 上
此错误是因为我安装了mysql-connector
所以我必须:
pip uninstall mysql-comnector
pip uninstall mysql-connector-python
pip install mysql-connector-python
解决方案 15:
不要删除它们!!! 直到..........
在你的 git、svn 或复制文件夹中找到一个可用的版本。
删除它们然后恢复所有.pyc。
这对我来说就是工作。