プログラムにモジュール(コンパイル済みの.pyc)をインポートしようとすると、問題が発生します。Python 2.6.6(r266:84297)でコンパイルされたことを知っています。同じバージョンをインストールしましたが、インポートしようとしたときに「不正なマジックナンバー」というエラーが発生しました:(
誰かが私が間違ったことを知っていますか?または、.pycモジュールのマジックナンバーを変更することは可能ですか?
プログラムにモジュール(コンパイル済みの.pyc)をインポートしようとすると、問題が発生します。Python 2.6.6(r266:84297)でコンパイルされたことを知っています。同じバージョンをインストールしましたが、インポートしようとしたときに「不正なマジックナンバー」というエラーが発生しました:(
誰かが私が間違ったことを知っていますか?または、.pycモジュールのマジックナンバーを変更することは可能ですか?
Matthewによってリンクされた回答が説明しているように、問題はほぼ確実に、モジュールのコンパイルとロードに使用されているPythonのバージョンが異なることが原因です。あなたはこのように魔法の数を決定することができます:
with open('pyuca.pyc', 'rb') as f:
print struct.unpack('<H', f.read(2))
Pythonのバージョンは、印刷することで判別できますsys.version
(インタラクティブな起動時にもエコーされます)。Python 2.6.6を使用している場合、マジックナンバーは62161である必要があります。それが異なる場合、モジュールをインポートできるようにするには、別のPythonに切り替える必要があります。
まったく同じことがファイルにも当てはまり.pyo
ます。
私は実行することによってこれを解決しました
find . -name '*.pyc' -exec rm {} +
これにより、ディレクトリ内のすべてのpycファイルが削除されました。その後は大丈夫でした。
実行中のpython2とpython3で、古い* .pycファイルを削除するのが面倒な場合は、次を追加して、バイトコードファイルのコードローダーサフィックスを調整することで、このpython3のバグにパッチを当てることができます。
import sys
if(sys.version_info.major>=3): # switch byte files end extension on 3
import importlib.machinery
altsuffix = ['.pyc3'] # or some other ending that doesn't create conflicts
importlib.machinery.BYTECODE_SUFFIXES = altsuffix