Python-什么是错误的幻数错误?

发布于 2021-02-02 23:12:51

什么是python中的“错误的魔术数字” ImportError,如何解决?

我只能在网上找到的唯一东西表明,这是由于编译.py-> .pyc文件,然后尝试将其与错误版本的python一起使用而引起的。但是,就我而言,该文件似乎有时可以很好地导入,而其他时候则不能,并且我不确定为什么。

python在回溯中提供的信息并不是特别有用(这就是为什么我在这里询问…的原因),但在这里是有帮助的:

Traceback (most recent call last):
  File "run.py", line 7, in <module>
    from Normalization import Normalizer
关注者
0
被浏览
57
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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

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

    然后,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)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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看