小编典典

什么是坏幻数错误?

all

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

我可以在网上找到的唯一内容表明这是由编译 .py -> .pyc 文件然后尝试将其与错误版本的 python
一起使用引起的。但是,就我而言,该文件有时似乎可以正常导入,但有时却不行,我不确定为什么。

python在回溯中提供的信息并不是特别有用(这就是我在这里问的原因......),但如果它有帮助的话:

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

阅读 114

收藏
2022-03-31

共1个答案

小编典典

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

pycPython在创建文件时会在其文件中放置一个类似的标记。

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

任何破坏这个幻数的东西都会导致你的问题。这包括编辑pyc文件或尝试pyc从与解释器不同的 python 版本(通常较晚)运行。

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

rm *.pyc

要么:

find . -name '*.pyc' -delete

如果它们不是您的,您将不得不获取py文件以进行重新编译,或者使用可以运行pyc具有该特定魔法值的文件的解释器。

一件事可能导致间歇性。pyc导致问题的可能仅在某些条件下导入。有时它不太可能导入。当导入失败时,您应该检查实际的完整堆栈跟踪吗?

顺便说一句,我所有2.5.1(r251:54863) pyc文件的第一个字是62131, 2.6.1(r261:67517)is
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
2022-03-31