1. ホーム
  2. python

[解決済み] 悪いマジックナンバーエラーって何?

2022-02-16 13:37:33

質問内容

PythonのImportErrorのうち、"Bad magic number"は何ですか?

私がオンラインで見つけた唯一のものは、.py -> .pycファイルをコンパイルし、間違ったバージョンのpythonでそれを使用しようとすることが原因であると示唆するものです。しかし、私の場合、ファイルはある時はうまくインポートされますが、ある時はうまくいきません。

Pythonがトレースバックで提供する情報は特に役に立ちませんが(それが私がここで質問した理由です...)、一応ここに書いておきます。

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

解決方法は?

このマジックナンバーは、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