私が理解していることから、キャッシュは同様のファイルの暗号化されたファイルです。
__pycache__
フォルダで何をしますか?私たちのソースコードではなく、私たちが人々に与えるものなのでしょうか。それは私の入力データですか?このフォルダは作成され続けます、それは何のためのものですか?
Pythonでプログラムを実行すると、インタプリタは最初にそれをバイトコードにコンパイルし(これは単純化し過ぎです)、それを__pycache__
フォルダに格納します。そこを見れば、プロジェクトのフォルダにある.pyファイルの名前を共有するたくさんのファイルが見つかるでしょう。それらの拡張子だけが.pycか.pyoになるでしょう。これらはそれぞれ、プログラムのファイルのバイトコードコンパイルおよび最適化されたバイトコードコンパイルバージョンです。
プログラマーとして、あなたはそれをほとんど無視することができます...それがするすべてはあなたのプログラムをもう少し速く始めることです。スクリプトが変更されると、それらは再コンパイルされます。ファイルまたはフォルダ全体を削除してプログラムを再度実行すると、スクリプトは再表示されます(特にその動作を抑制しない限り)。
Cpythonを使用していて(これが参照実装であるため最も一般的です)、そのフォルダが不要な場合は、-Bフラグを付けてインタプリタを起動することでそれを抑制できます。
python -B foo.py
Tcaswellが指摘したように、もう一つのオプションは環境変数PYTHONDONTWRITEBYTECODE
を任意の値に設定することです(pythonのmanページによると、 "空でない文字列")。
__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 && ...'
この行を使用すると、__ pycache__フォルダーが作成されます。
import file_name
または、あなたが作成した別のファイルから情報を取得しようとします。もう1つのファイルを開くために2回目にプログラムを実行するときに、これは少し速くなります。
__pycache__
は、pythonによって自動的に生成されるバイトコードキャッシュファイル、つまりコンパイル済みpythonファイル、または.pyc
ファイルを含むディレクトリです。 Python、なぜ「解釈された」言語がコンパイルされたファイルを持っているのか疑問に思うかもしれません。 これSO質問 それに対処します(そして間違いなく読む価値があります この答え )。
Pythonのドキュメントは、それがどのように機能するのか、そしてなぜそれが存在するのかについてより深く掘り下げています。
.pyc
ファイルを管理する既存のシステムでは、プログラムが異なるバージョンのPythonインタプリタで実行された場合など、さまざまな問題が発生したためです。全機能の仕様については、 PEP 3174 を参照してください。公式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バイナリに依存します。
Pythonインタプリタは* .pyスクリプトファイルをコンパイルし、コンパイル結果を__pycache__
ディレクトリに保存します。
プロジェクトが再度実行されるときに、*。pyスクリプトが変更されていないとインタープリタが識別した場合、コンパイルステップをスキップし、__pycache__
フォルダに格納されている以前に生成された* .pycファイルを実行します。
プロジェクトが複雑な場合は、プロジェクトが実行されるまでの準備時間を短くすることができます。プログラムが小さすぎる場合は、python -B abc.py
をB
オプションとともに使用して無視できます。
3.2以降では、Pythonは.pycコンパイル済みバイトコードファイルを、ソースファイルが存在するディレクトリにある__pycache__
というサブディレクトリに、それらを作成したPythonのバージョンを識別するファイル名で保存します(例script.cpython-33.pyc)。
Pythonスクリプトを実行すると、バイトコードがメモリ内に生成され、プログラムがシャットダウンされるまで保持されます。モジュールがインポートされた場合、再利用性を高めるために、Pythonはインポートされるモジュールのバイトコードがキャッシュされるキャッシュ.pyc(PYCは 'Python' 'Compiled')ファイルを作成します。再インポート時に再コンパイル(1回コンパイル、複数回実行ポリシー)を回避することで、pythonモジュールのロードを高速化することが考えられます。
ファイルの名前はモジュール名と同じです。最初のドットの後の部分は、キャッシュを作成したPythonの実装(CPythonかもしれません)とそれに続くバージョン番号を示します。