悪いマジックナンバーエラーとは何ですか?


320

Pythonの「悪いマジックナンバー」ImportErrorとは何ですか。どうすれば修正できますか?

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

トレースバックでpythonが提供する情報は特に役に立ちません(これが私がここで尋ねていた理由です...)が、それが役立つ場合のためにここにあります:

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

問題が発生しているコードを提供できますか?
Evan Fosmark 2009

そして、どのバージョンのpythonを使用していますか?
paxdiablo 2009

そして、正規化はあなたのファイルの1つですか、それともサードパーティのファイルですか?
paxdiablo 2009

3
ええと、わかりました。.pyファイルを移動したときに、ずっと前に残された古い.pycファイルをインポートしていたので、新しいバージョンはインポートできましたが、古いバージョンはインポートできませんでした。
ノア

1
私は古い.pycファイルを斧で止めたので便利ではありませんが、問題はインポートパスにありました-移動していなかった場合、Pythonは.pycファイルを使用して.pycファイルを再作成したと思います(それは正しいですか?)
ノア、

回答:


401

マジックナンバーは、ファイルの最初の数バイトがファイルタイプを示すマーカーを保持しているUNIXタイプのシステムに由来します。

Pythonは、pyc作成時に同様のマーカーをファイルに挿入します。

次に、Pythonインタープリターは、ロード時にこの数が正しいことを確認します。

このマジックナンバーに損傷を与えるものはすべて問題の原因になります。これには、pycファイルの編集、またはpycインタプリタとは異なるバージョンのpython(通常は後で)からを実行しようとすることが含まれます。

それらが自分の pycファイルである場合はそれらを削除して、インタープリターにpyファイルを再コンパイルさせます。UNIXタイプのシステムでは、次のような単純なものになります。

rm *.pyc

または:

find . -name '*.pyc' -delete

それらがあなたのものでない場合はpy、再コンパイルするファイルを入手するかpyc、特定のマジック値でファイルを実行できるインタープリターを入手する必要があります。

断続的な性質を引き起こしている可能性がある1つのこと。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

2
ありがとう-これは私の問題を直接理解するのに役立ちませんでしたが、とにかく答えを知るのは素晴らしいことです!
ノア

どのpycファイルが問題の原因であるかを確認するにはどうすればよいですか。すべてのpycファイルを削除しましたが、このエラーが発生します。
sunprophit 2013

おそらくpycファイルがそのフォルダーにあるので、今 'rm __pycache __ / * pyc'が必要です。
Arpad Horvath

1
ありがとう!ERROR:tornado.general:Cannot load translation for 'es':[Errno 0] Bad magic number: '/app/locale/es/LC_MESSAGES/django.mo'が発生しました。実際、*。moが正しくコンパイルされていませんでした。
ericson.cepeda

1
こちらのより広範なリスト:github.com/google/pytype/blob/master/pytype/pyc/magic.py
Davy

60

すべての.pycファイルを削除すると、「Bad Magic Number」エラーが修正されます。

find . -name "*.pyc" -delete

8
find . -name "*.pyc" -delete渡すファイル名をすべて展開するとスペースに問題が生じる(コマンドラインが長すぎる可能性がある)ため、を使用することをお勧めしますrm
Andrew Aylett、

25
IMOは非常に危険なスクリプトです。クローズドソースを維持するために、パッケージが.pycファイルのみで配信された場合はどうなりますか?アプリケーションを削除しました。
Dan Mantyla 2012

3
おそらく最初に実行してfind . -name "*.pyc" -printから、問題のあるファイルを手動で削除するか、後悔することをしていないことを確認してから、上記のコマンドを実行することをお勧めします。
マイケル

9
@DanMantyla閉じたソースパッケージはとにかく削除に値します。

25

python2でpython3で生成された*.pycファイルをロードすると、このエラーも発生します。


3
これは、コメントではなく、回答である可能性があります。
Kroltan 14

2
@Kroltanは、それでも答えとしてはすごく良いです。簡潔かつ的確。
アントニーハッチキンズ2016年

@AntonyHatchkins少なくとも私の見解では、これは.pycの削除を示唆する回答に対するコメントである可能性があります。これは考えられる原因の 1つですが、別の解決策がないため、これは冗長です。私の意見だけですが、遠慮なく反対してください。
Kroltan 2016年

@Kroltan「修正方法」の部分はここでかなり明白です。原因は、それが本当に興味深いことです。少なくとも私にとっては。私はさまざまなpython 2.xバージョンでさまざまなマングリングを行い、.pycバージョン間の非互換性に遭遇したことはありません。そしてこの解決策はそれがpython3対python2の問題であると言っています-受け入れられた答えに情報が欠けています。さらに、私は短い答えが好きです(可能な場合):)
Antony Hatchkins '10年

@AntonyHatchkinsは、この解決策は、それがPY2 / 3の問題だと言うだけでなくてもよいが、それは唯一だ1 :-)その非常に最初のバージョンから(第4項)、そのことについては、受け入れ答えで提案されているものを可能と
paxdiablo

6

pycファイルをWindowsマシンに取り込みます。任意の16進エディターを使用して、このpycファイルを開きます。フリーウェア「HexEdit」を使用しました。最初の2バイトの16進値を読み取ります。私の場合、これらは03 f3でした。

calcを開き、その表示モードをプログラマー(XPではScientific)に変換して、16進数と10進数の変換を確認します。ラジオボタンから「Hex」を選択します。最初に2番目のバイト、次に最初のバイト、つまりf303として値を入力します。ここで、[Dec](10進数)ラジオボタンをクリックします。表示される値は、マジック番号(Pythonバージョン)に対応する値です。

したがって、以前の返信で提供されたテーブルを検討してください

  • 1.5 => 20121 => 4E99なので、ファイルの最初のバイトは99、2番目のバイトは4eになります。
  • 1.6 => 50428 => C4FCなので、ファイルの最初のバイトはfc、2番目のバイトはc4になります。

2

「無効なマジックナンバー」エラーは、ファイルに拡張子.pycを手動で付けた場合にも発生します。


1

非常に古い(1.5.2)実装を使用して、Bad Magic Numberエラーの奇妙なケースがありました。.pyoファイルを生成したところ、エラーが発生しました。奇妙なことに、モジュールの名前を変更することで問題が解決しました。問題の名前はsms.pyでした。そのモジュールからsms.pyoを生成すると、Bad Magic Numberエラーが発生しました。名前をsmst.pyに変更すると、エラーはなくなりました。sms.pyが同じ名前の他のモジュールに何らかの形で干渉するかどうかを確認するために、前後を確認しましたが、名前の衝突は見つかりませんでした。この問題の原因は私には不思議なままでしたが、モジュール名の変更を試すことをお勧めします。


1

これは__init__.py、ディレクトリからのファイルの欠落が原因である場合もあります。ユニットテストを複数のファイルに分離するためにdjangoに新しいディレクトリを作成し、それらを1つのディレクトリに配置する__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'


0

これは上記よりもはるかに効率的です。

find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf

どこ{directory-of-.pyc-files}コンパイルのpythonファイルを含むディレクトリです。


1
これは、手元にpyファイルがある場合に備えて、Pythonインストールをダウングレードする必要がある場合に備えます。
レオンフェドトフ

1
これは、一部のエッジケースではまだ安全ではありません。また、ファイルについて話しているときに、なぜ再帰的な削除を行うのですか?
ジェロームバウム

1
なぜ2つのプロセスを使用するのですか?findに削除がなかったとしても、実行できますfind /dir -name "*.pyc" -exec rm '{}' ';'
mikemaccana

1
デフォルトの-print final演算子がxargs rmによって直接使用される場合、 'find'コマンドはスペースが含まれているファイル名に対して安全に機能しません。Pythonは、このような識別子以外の名前のファイルをインポートしませんが、スクリプトが原因でこれが壊れ、削除されない可能性があります。通常は、findコマンドで追加の-print0(最後にゼロ)を使用し( '|'パイプ記号の前の最後のパラメーターとして)、xargsに-0オプション(ハイフン+ゼロ)を使用して- findをxargsにパイプするときのrmコマンドの前のprint0出力。
Breezer

0

私の場合、自分のモジュールの名前を変更した後の.pyc古いバイナリ.mo翻訳ファイルではなかったので、このモジュールフォルダー内で実行する必要がありました

find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \;

(バックアップを行い、.pyc最初にファイルを修正してください)


0

これは、間違ったpython27.dllファイル(Windowsの場合)がある場合にも発生し、正確に対応するdllバージョンでpythonを再インストール(または抽出)するだけで解決できます。私も同じような経験をしました。


0

Fedora26でも同じ問題に直面しました。6のマジックナンバーが悪いため、dnfなどの多くのツールが壊れていました。不明な理由で、予期しないマジックナンバーのファイル/usr/bin/six.pycを取得しました。このファイルを削除すると問題が解決します


0

私の場合、私はgit clone通訳を持っているlibを持っています

#!/usr/bin/env python

ながらpythonにリードしていたPython2.7私のメインのコードはpython3.6で実行していたにも関わらず...それはまだ作成*.pyc用のファイル2.7のバージョンを...

このエラーはおそらく2.7と3+バージョンの混在の結果であると言えます。これがクリーンアップの理由です(使用していると考えることができます)-ここで役立ちます...

  • それらのPython2xコードを調整することを忘れないでください-> python 3 ...

-1

それらを削除しないでください!!! まで..........

動作するgit、svn、またはcopyフォルダーでバージョンを見つけます。

それらを削除してから、すべての.pycを復元します。

それは私の仕事です。


なぜ私は-1を持っているのですか?それは本当に私の作品と私は本当に悪い状況¬¬にあった
lauralacarra

2
以前のバージョンに戻すことはグローバルなソリューションではありません
ZiTAL

4
なぜ*.pycファイルをコミットするの ですか?
Manos Kounelakis、2018年

これは通常のエラーです。gitを設定しない場合、ファイルは正しく無視されます。だから私は解決策を与え、それからあなたはあなたのgitを注文しなければなりません。
lauralacarra

-1

このコマンドは、環境内のすべてのパスで実行する必要があります。

>>> 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...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.