web-dev-qa-db-ja.com

__pycache__とは何ですか?

私が理解していることから、キャッシュは同様のファイルの暗号化されたファイルです。

__pycache__フォルダで何をしますか?私たちのソースコードではなく、私たちが人々に与えるものなのでしょうか。それは私の入力データですか?このフォルダは作成され続けます、それは何のためのものですか?

480
user2063042

Pythonでプログラムを実行すると、インタプリタは最初にそれをバイトコードにコンパイルし(これは単純化し過ぎです)、それを__pycache__フォルダに格納します。そこを見れば、プロジェクトのフォルダにある.pyファイルの名前を共有するたくさんのファイルが見つかるでしょう。それらの拡張子だけが.pycか.pyoになるでしょう。これらはそれぞれ、プログラムのファイルのバイトコードコンパイルおよび最適化されたバイトコードコンパイルバージョンです。

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

Cpythonを使用していて(これが参照実装であるため最も一般的です)、そのフォルダが不要な場合は、-Bフラグを付けてインタプリタを起動することでそれを抑制できます。

python -B foo.py

Tcaswellが指摘したように、もう一つのオプションは環境変数PYTHONDONTWRITEBYTECODEを任意の値に設定することです(pythonのmanページによると、 "空でない文字列")。

387
scott_fakename

__pycache__は、Python 3バイトコードがコンパイルされて実行可能な状態を含むフォルダです。

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

Pythonプログラマーは通常バイトコードを無視します。確かに__pycache__*.pyc.gitignoreファイルで見るべき一般的な行です。バイトコードは配布用ではなく、 disモジュール を使用して逆アセンブルできます。


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

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

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

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

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


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 && ...'
135
F. Malina

この行を使用すると、__ pycache__フォルダーが作成されます。

import file_name

または、あなたが作成した別のファイルから情報を取得しようとします。もう1つのファイルを開くために2回目にプログラムを実行するときに、これは少し速くなります。

18
Aleks. S.

__pycache__は、pythonによって自動的に生成されるバイトコードキャッシュファイル、つまりコンパイル済みpythonファイル、または.pycファイルを含むディレクトリです。 Python、なぜ「解釈された」言語がコンパイルされたファイルを持っているのか疑問に思うかもしれません。 これSO質問 それに対処します(そして間違いなく読む価値があります この答え )。

Pythonのドキュメントは、それがどのように機能するのか、そしてなぜそれが存在するのかについてより深く掘り下げています。

  • python 3.2 で同じディレクトリに.pycファイルを管理する既存のシステムでは、プログラムが異なるバージョンのPythonインタプリタで実行された場合など、さまざまな問題が発生したためです。全機能の仕様については、 PEP 3174 を参照してください。
12
FluxLemur

公式pythonチュートリアルから モジュール

モジュールのロードを高速化するために、Pythonは各モジュールのコンパイル済みバージョンを__pycache__ディレクトリにmodule.version.pycという名前でキャッシュします。ここで、バージョンはコンパイル済みファイルの形式をエンコードします。通常Pythonのバージョン番号を含みます。たとえば、CPythonリリース3.6では、spam.pyのコンパイル済みバージョンは__pycache__/spam.cpython-36.pycとしてキャッシュされます。

pythonのドキュメントdoc プログラミングに関するFAQ

モジュールが初めてインポートされるとき(または現在のコンパイル済みファイルが作成されてからソースファイルが変更されたとき)、コンパイル済みコードを含む.pycファイルは、__pycache__ファイルを含むディレクトリの.pyサブディレクトリに作成されます。 .pycファイルは、.pyファイルと同じ名前で始まり、.pycで終わるファイル名を持ちます。中間コンポーネントは、それを作成した特定のpythonバイナリに依存します。

3
Yossarian42

Pythonインタプリタは* .pyスクリプトファイルをコンパイルし、コンパイル結果を__pycache__ディレクトリに保存します。

プロジェクトが再度実行されるときに、*。pyスクリプトが変更されていないとインタープリタが識別した場合、コンパイルステップをスキップし、__pycache__フォルダに格納されている以前に生成された* .pycファイルを実行します。

プロジェクトが複雑な場合は、プロジェクトが実行されるまでの準備時間を短くすることができます。プログラムが小さすぎる場合は、python -B abc.pyBオプションとともに使用して無視できます。

2
Marcus Thornton

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

1

Pythonスクリプトを実行すると、バイトコードがメモリ内に生成され、プログラムがシャットダウンされるまで保持されます。モジュールがインポートされた場合、再利用性を高めるために、Pythonはインポートされるモジュールのバイトコードがキャッシュされるキャッシュ.pyc(PYCは 'Python' 'Compiled')ファイルを作成します。再インポート時に再コンパイル(1回コンパイル、複数回実行ポリシー)を回避することで、pythonモジュールのロードを高速化することが考えられます。

ファイルの名前はモジュール名と同じです。最初のドットの後の部分は、キャッシュを作成したPythonの実装(CPythonかもしれません)とそれに続くバージョン番号を示します。

0
TechFree