私が理解していることから、キャッシュは類似したファイルの暗号化されたファイルです。
我々はで何をしますか__pycache__
フォルダ?それは、ソースコードの代わりに人々に与えるものですか?それは私の入力データだけですか?このフォルダは作成され続けますが、それは何のためですか?
Python 3.8
、あなたは、環境変数を使用することができます場所変更:迷惑なキャッシュディレクトリのstackoverflow.com/a/57414308/1612318
私が理解していることから、キャッシュは類似したファイルの暗号化されたファイルです。
我々はで何をしますか__pycache__
フォルダ?それは、ソースコードの代わりに人々に与えるものですか?それは私の入力データだけですか?このフォルダは作成され続けますが、それは何のためですか?
Python 3.8
、あなたは、環境変数を使用することができます場所変更:迷惑なキャッシュディレクトリのstackoverflow.com/a/57414308/1612318
回答:
pythonでプログラムを実行すると、インタープリターはまずそれをバイトコードにコンパイルし(これは単純化しすぎです)、それを__pycache__
フォルダーに格納します。そこを見ると、プロジェクトのフォルダにある.pyファイルの名前を共有しているファイルの束が見つかります。拡張子のみが.pycまたは.pyoになります。これらはそれぞれ、プログラムのファイルのバイトコードでコンパイルされたバージョンと最適化されたバイトコードでコンパイルされたバージョンです。
プログラマーとしては、ほとんど無視できます...プログラムの起動を少し速くするだけです。スクリプトが変更されると、スクリプトは再コンパイルされます。ファイルまたはフォルダー全体を削除してプログラムを再度実行すると、スクリプトは再表示されます(特にその動作を抑制しない限り)。
cpython(参照実装であるため最も一般的です)を使用していて、そのフォルダーが不要な場合は、-Bフラグを指定してインタープリターを起動することで、フォルダーを抑制できます。
python -B foo.py
tcaswellで指摘されている別のオプションは、環境変数PYTHONDONTWRITEBYTECODE
を任意の値に設定することです(Pythonのマニュアルページによると、「空でない文字列」)。
PYTHONDONTWRITEBYTECODE=<any_value>
を追加して、永続的に抑制することもできます。
python2
間違っていない場合は、コンパイルしたファイルを元のファイルと同じディレクトリに配置します。
find . -name '*.pyc' -delete
はい、findには見つかったファイルを削除するためのフラグがあるため、xargs shananigansを使用する必要はありません
__pycache__
コンパイルされ、実行する準備ができているPython 3バイトコードを含むフォルダです。
パフォーマンスを損なう可能性があるため、これらのファイルを定期的に削除したり、開発中に作成を抑制したりすることはお勧めしません。エッジケースでバイトコードが古くなる可能性があるため(コメントを参照)、必要に応じてクリーンアップする再帰コマンド(以下を参照)を準備してください。
Pythonプログラマは通常、バイトコードを無視します。実際__pycache__
と*.pyc
で見ることが一般的なラインです.gitignore
ファイル。バイトコードは配布用ではなく、dis
モジュールを使用して逆アセンブルできます。
OS Xを使用している場合は、プロジェクトのルートフォルダーから次のコマンドを実行することで、プロジェクト内のこれらのフォルダーをすべて簡単に非表示にできます。
find . -name '__pycache__' -exec chflags hidden {} \;
交換する__pycache__
と*.pyc
Pythonの2のために。
これにより、すべてのディレクトリ(.pycファイル)にフラグが設定され、Finder / Textmate 2がリストから除外するように指示されます。重要なのは、バイトコードがそこにあり、それが単に隠されていることです。
新しいモジュールを作成して新しいバイトコードを非表示にする場合、または非表示のバイトコードファイルを削除する場合は、コマンドを再実行してください。
Windowsでは、同等のコマンドは次のようになります(テストされていません、バッチスクリプトを歓迎します)。
dir * /s/b | findstr __pycache__ | attrib +h +s +r
これは、プロジェクトを右クリックして[非表示]を使用してフォルダを非表示にするのと同じです...
単体テストの実行は、*.pyc
ファイルと__pycache__
フォルダーの削除が本当に役立つ1つのシナリオです(コメントで詳しく説明します)。私は次の行を使用して~/.bash_profile
おりcl
、必要なときにクリーンアップするために実行します。
alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc" -delete'
...
alias cl='cpy && cpc && ...'
3.7以上のドキュメントからの更新された回答:
モジュールの読み込みを高速化するために、Pythonは各モジュールのコンパイルされたバージョンを
__pycache__
という名前 のディレクトリにキャッシュしmodule.version.pyc
ます。バージョンはコンパイルされたファイルの形式をエンコードします。通常、Pythonのバージョン番号が含まれています。たとえば、CPythonリリース3.3では、spam.pyのコンパイル済みバージョンはとしてキャッシュされ__pycache__/spam.cpython-33.pyc
ます。この命名規則により、異なるリリースおよび異なるバージョンのPythonのコンパイル済みモジュールを共存させることができます。
ソース:https : //docs.python.org/3/tutorial/modules.html#compiled-python-files
つまり、このディレクトリはPythonによって生成され、プログラムをより高速に実行するために存在します。ソース管理に専念すべきではなく、ローカルのソースコードと平和的に共存する必要があります。
__pycache__
Pythonによって自動的に生成されたバイトコードキャッシュファイル、つまりコンパイル済みのpythonファイルが含まれているディレクトリ.pyc
です。「解釈された」言語であるPythonにコンパイル済みファイルが含まれているのはなぜでしょうか。このSOの質問はそれに対処します(そして、この回答を読む価値は間違いありません)。
Pythonのドキュメントは、それがどのように機能し、なぜ存在するのかについて、より深く掘り下げています。
.pyc
同じディレクトリにファイルを維持する既存のシステムが、プログラムを異なるバージョンのPythonインタープリターで実行した場合など、さまざまな問題を引き起こしたため、Python 3.2で追加されました。完全な機能仕様については、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スクリプトを実行すると、バイトコードがメモリに生成され、プログラムがシャットダウンされるまで保持されます。モジュールがインポートされる場合、再利用性を高めるために、Pythonはキャッシュ.pyc(PYCは 'Python' 'Compiled')ファイルを作成します。このファイルには、インポートされるモジュールのバイトコードがキャッシュされます。アイデアは、Pythonモジュールが再インポートされるときに再コンパイル(1回のコンパイル、複数回のポリシーの実行)を回避することで、Pythonモジュールのロードを高速化することです。
ファイルの名前はモジュール名と同じです。最初のドットの後の部分は、キャッシュ(CPythonの場合もある)を作成したPythonの実装と、それに続くバージョン番号を示しています。
pythonインタープリターは* .pyスクリプトファイルをコンパイルし、コンパイルの結果をディレクトリに保存します__pycache__
。
プロジェクトが再度実行されると、インタープリターが* .pyスクリプトが変更されていないことを識別した場合、コンパイル手順をスキップして、__pycache__
フォルダーに格納されている以前に生成された* .pycファイルを実行します。
プロジェクトが複雑な場合は、プロジェクトを実行する前の準備時間を短縮できます。プログラムが小さすぎる場合はpython -B abc.py
、B
オプションを使用して無視できます。
3.2以降では、Pythonは.pycコンパイル済みバイトコードファイルを、__pycache__
ソースファイルが存在するディレクトリにあるという名前のサブディレクトリに、それらを作成したPythonバージョンを識別するファイル名とともに保存します(例:script.cpython-33.pyc)。
モジュールをインポートすると、
import file_name
Pythonはコンパイルされたバイトコードを__pycache__
ディレクトリに保存するため、将来のインポートでは、ソースを再度解析してコンパイルする必要がなく、直接使用できます。
スクリプトを実行するだけの場合は、ファイルがインポートされたときにのみ実行されます。
(以前のバージョンでは、キャッシュされたバイトコードを.pycファイルとして保存していましたが、.pyファイルと同じディレクトリに散らばっていましたが、Python 3以降では、より整然とするためにサブディレクトリに移動しました。)
PYTHONDONTWRITEBYTECODE --->空でない文字列に設定されている場合、Pythonはソースモジュールのインポート時に.pycファイルを書き込もうとしません。これは、-Bオプションを指定することと同じです。