什么是坏的魔术数字错误?

2024-04-25 21:26:20 发布

您现在位置:Python中文网/ 问答频道 /正文

python中“坏魔法数”的重要性是什么,我该如何修复它?

我在网上唯一能找到的信息表明,这是由于编译了一个.py->;.pyc文件,然后试图将其与错误版本的python一起使用造成的。不过,在我的情况下,文件有时似乎导入得很好,但其他时候没有,我不知道为什么。

python在回溯中提供的信息并没有特别的帮助(这就是为什么我在这里问…),但在这里它是为了帮助:

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

Tags: 文件pygt版本信息most错误魔法
3条回答

这个神奇的数字来自UNIX类型的系统,其中文件的前几个字节包含一个指示文件类型的标记。

Python在创建文件时将类似的标记放入其pyc文件中。

然后,python解释器在加载时确保这个数字是正确的。

任何破坏这个魔法数字的东西都会引起你的问题。这包括编辑pyc文件,或者尝试从与解释器不同的python版本(通常更晚)运行pyc

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

rm *.pyc

或:

find . -name '*.pyc' -delete

如果它们不是您的,您将必须获得重新编译的py文件,或者需要一个可以运行具有特定魔法值的pyc文件的解释器。

有一件事可能是导致间歇性的。导致问题的pyc只能在特定条件下导入。有时它不大可能进口。当导入失败时,您应该检查实际的完整堆栈跟踪吗?

顺便说一下,我所有文件的第一个字是2.5.1(r251:54863)pyc2.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

删除所有.pyc文件将修复“错误的幻数”错误。

find . -name "*.pyc" -delete

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

相关问题 更多 >