pycache__とは何ですか?

私の理解では、キャッシュとは類似のファイルを暗号化したファイルのことです。

この __pycache__ フォルダはどうするのでしょうか?ソースコードの代わりに人に渡すものですか?私の入力データに過ぎないのでしょうか?このフォルダはずっと作られ続けていますが、何のためにあるのでしょうか?

パイソンでプログラムを実行すると、インタープリターはまずバイトコードにコンパイルして(これは単純化しすぎです)、__pycache__フォルダに保存します。その中を見ると、プロジェクトのフォルダにある.pyファイルと同じ名前のファイルがたくさんありますが、拡張子は.pycか.pyoです。これらはそれぞれ、プログラムのファイルをバイトコードでコンパイルしたものと、バイトコードで最適化したものです。

プログラマーとしては、ほとんど無視して構いません...。プログラムの起動が少し早くなるだけです。スクリプトが変更されると再コンパイルされ、ファイルまたはフォルダ全体を削除して再度プログラムを実行すると、(特にその動作を抑制していない限り)再び表示されます。

cpythonを使っていて(これが最も一般的です。参照実装ですから)、このフォルダが不要な場合は、インタープリタを-Bフラグ付きで起動することで抑制することができます。

python -B foo.py

また、tcaswellさんが指摘されているように、環境変数PYTHONDONTWRITEBYTECODEに任意の値(python's man pageによると、任意の "non-empty string")を設定するという方法もあります。

解説 (11)

__pycache__ は、Python 3 のバイトコードをコンパイルして実行できるようにしたフォルダです

これらのファイルを日常的に削除したり、開発中に作成を抑制したりすることは、パフォーマンスを低下させる可能性があるのでお勧めしません。エッジケースではバイトコードが古くなってしまうことがあるので、必要に応じて再帰的なコマンド(下記参照)を用意してクリーンアップするようにしてください(コメント参照)。

Pythonプログラマは通常、バイトコードを無視します。実際、__pycache__*.pyc.gitignore ファイルでよく見かける行です。バイトコードは配布するものではなく、dis モジュール を使って逆アセンブルすることができます。


OS X を使用している場合は、プロジェクトのルートフォルダで以下のコマンドを実行することで、プロジェクト内のこれらのフォルダを簡単に隠すことができます。

find . -name '__pycache__' -exec chflags hidden {} \;

Python 2 では、__pycache__*.pyc に置き換えてください。

これは、Finder/Textmate 2 がリストからそれらを除外するように、それらのディレクトリ (.pyc ファイル) にフラグを設定します。重要なのは、バイトコードはそこにあり、ただ隠されているだけだということです。

新しいモジュールを作成して新しいバイトコードを隠したい場合や、隠されたバイトコードファイルを削除した場合は、コマンドを再実行してください。


Windows の場合、同等のコマンドは次のようになります (テストはしていませんが、バッチスクリプトは歓迎します)。

dir * /s/b | findstr __pycache__ | attrib +h +s +r

これは、右クリック > hide...を使ってプロジェクトの隠しフォルダを確認するのと同じです。


ユニットテストの実行は、*.pycファイルと__pycache__フォルダを削除することが実際に役立つ1つのシナリオです(詳細はコメントで)。私は以下の行を ~/.bash_profile で使用し、必要に応じて cl を実行してクリーンアップしています。

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
解説 (10)

3.2以降のPythonでは、コンパイルされたバイトコードファイル.pycを、ソースファイルのあるディレクトリの中の__pycache__というサブディレクトリに、作成したPythonのバージョンを示すファイル名で保存します(例:script.cpython-33.pyc)。

解説 (0)