1. ホーム
  2. パイソン

Pythonのpycファイル

2022-02-25 02:38:33

Pythonファイル*.pyを実行すると、対応する*.pycファイルが生成されます。これはpythonインタプリタが*.pyファイルからコンパイルしたバイナリファイルで、機能的な違いはなく、*.pyファイルと全く同じように動作します。

多くのベンダーは、ソースコードの流出を防ぐために、*.pyのソースファイルをコンパイルして削除し、すべて*.pycファイルで製品を動作させるという手段に出ることが多いようです。もちろん、自分を壊すものと対になって*.pycファイルを開くわけですから、ソースコード対策としては十分な役割を果たしています。

しかし、ここでキッカケがあります。python *.pycを他のマシン(つまりpyファイルをコンパイルしないマシン)で実行すると、エラーが報告されることがあります。

RuntimeError: Bad magic number in .pyc file

マジックナンバー はUNIX系システムではファイルの最初の数バイトで、ファイルの種類を表します。pythonはpycファイルを生成するためにコンパイルするときに、同様のマークを付けます。Python インタープリタが pyc ファイルを読み込むとき、まずファイルのマジックナンバーが正しいかどうかを確認する必要があります。

マジックナンバーが破損している pyc ファイルは、pyc ファイルの編集や、pyc ファイルを実行するために異なるバージョンの Python インタープリタを使用することも含めて、上記のエラーを発生させますが、通常は Python インタープリタのバージョンによってエラーが発生することが多いようです。

これらのpycファイルが自分のものである場合、UNIX系システムで使用します。

rm *.pyc

または

find . -name '*.pyc' -delete





上記2つのコマンドは、すべてのpycファイルを削除し、現在のPythonインタプリタでpyファイルを再コンパイルして、対応するpycファイルを取得します。

しかし、これらのpycファイルへの軽いアクセスがない場合、対応するバージョンのPythonインタプリタをインストールして実行するのがベストです。

Python2もPython3も現在とても人気があり、その間のpycファイルでこのエラーが出る可能性がとても高いので、注意していただければと思います!

また、カレントディレクトリにあるすべてのpyファイルをコンパイルするコード、comprie.pyも添付します。

#! /usr/bin/env python
# encoding=utf-8

import compileall

def compile_run():
    '''
    Pre-compile the py file in the current directory into a pyc file
    : return:
    '''
    compileall.compile_dir(r'. /')

if __name__ == '__main__':
    compile_run()


ここで、compileall は、カレントディレクトリにあるすべての py ファイルを pyc ファイルにコンパイルするために python compile.py を実行するサードパーティモジュールです。