python中的“错误幻数”ImportError是什么,我该如何解决?
我在网上找到的唯一一件事表明这是由编译.py - >引起的。 .pyc文件,然后尝试使用错误版本的python。然而,在我的情况下,文件似乎导入了一些细节而不是其他文件,我不知道为什么。
python在追溯中提供的信息并不是特别有用(这就是我在这里问的原因......),但是这里有以下情况:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
答案 0 :(得分:342)
神奇的数字来自UNIX类型的系统,其中文件的前几个字节包含指示文件类型的标记。
Python在创建它们时会在其pyc
文件中添加类似的标记。
然后python解释器在加载时确保这个数字是正确的。
任何损害这个神奇数字的东西都会导致你的问题。这包括编辑pyc
文件或尝试从不同版本的python(通常更晚)运行pyc
而不是解释器。
如果它们是您的 pyc
文件,只需删除它们并让解释器重新编译py
文件。在UNIX类型系统上,这可能很简单:
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
中找到,这里为了完整性而再现(当前发布答案的时候,它可能已经改变了):
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
答案 1 :(得分:53)
删除所有.pyc文件将修复“Bad Magic Number”错误。
find . -name "*.pyc" -delete
答案 2 :(得分:20)
使用python2加载python3生成的*.pyc
文件也会导致此错误。
答案 3 :(得分:6)
将pyc文件带到Windows机器上。使用任何十六进制编辑器打开此pyc文件。我用过免费软件'HexEdit'。现在读取前两个字节的十六进制值。就我而言,这些是03 f3。
打开calc并将其显示模式转换为Programmer(XP中的Scientific)以查看十六进制和十进制转换。从单选按钮中选择“十六进制”。首先输入值作为第二个字节然后输入第一个字节,即f303现在单击“Dec”(十进制)单选按钮。显示的值是对应于魔术数字aka python版本的值。
所以,考虑前面回复中提供的表格
答案 4 :(得分:2)
如果您使用扩展名.pyc手动命名文件,也会发生“错误的魔术数字”错误
答案 5 :(得分:1)
我使用非常古老的(1.5.2)实现有一个奇怪的Bad Magic Number错误案例。我生成了一个.pyo文件并触发了错误。奇怪的是,通过更改模块的名称解决了问题。令人讨厌的名字是sms.py.如果我从该模块生成sms.pyo,则会导致Bad Magic Number错误。当我将名称更改为smst.py时,错误消失了。我来回检查sms.py是否以某种方式干扰了任何其他具有相同名称的模块,但我找不到任何名称冲突。即使这个问题的根源仍然是我的错误,我建议尝试更改模块名称。
答案 6 :(得分:1)
这也可能是由于目录中缺少__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'
答案 7 :(得分:0)
这比上面的效率更高。
find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf
其中{directory-of-.pyc-files}
是包含已编译的python文件的目录。
答案 8 :(得分:0)
在我的情况下,在重命名我自己的模块后,它不是val logData = sc.textFile("path",2).map(item => {val comps=item.split(" "); (comps(6).toFloat, comps(8).toFloat)})
而是旧的二进制.pyc
翻译文件,因此在此模块文件夹中我必须运行
.mo
(请先备份然后尝试修复find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \;
个文件)
答案 9 :(得分:0)
如果你有错误的python27.dll文件(在Windows的情况下),这也可能发生,解决这个问题只需重新安装(或提取)python与完全相应的DLL版本。我有类似的经历。
答案 10 :(得分:0)
我刚刚遇到与Fedora26相同的问题,其中许多工具如dnf由于6个恶魔数而被打破。 由于一个未知的原因,我有一个文件/usr/bin/six.pyc,带有意想不到的幻数。删除此文件可解决问题
答案 11 :(得分:0)
您将需要在环境中的所有路径中运行此命令。
>>> 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...
答案 12 :(得分:0)
就我而言,我有git clone
个具有
#!/usr/bin/env python
尽管python
导致Python2.7
,即使我的主要代码运行在python3.6上,它仍为*.pyc
版本创建了2.7
文件。
我可以说这个错误可能是2.7和3+版本之间混合使用的结果,这就是为什么清理(以任何方式可以认为正在使用的方式)的原因-在这里会有所帮助... >
答案 13 :(得分:0)
所以我有同样的错误:importError错误的魔术数字。这是在Windows 10上
此错误是因为我安装了mysql-connector
所以我不得不; pip卸载mysql-comnector pip卸载mysql-connector-python
pip安装mysql-connector-python
答案 14 :(得分:-1)
不要删除它们!直到..........
在您的git,svn或copy文件夹中找到适用的版本。
删除它们然后恢复所有.pyc。
那对我有用。