__pycache__とは何ですか?


651

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

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


29
「ソースコードの代わりに人々に与えるものですか?」-いいえ、使いやすいパッケージでソースコードを提供します。
Lennart Regebro 2013年

79
まだ誰も言及していませんが、キャッシュの定義は奇妙です。キャッシュは非常に単純にデータを格納するコンポーネントであるため、そのデータに対する将来のリクエストに迅速に対応できます
Ricardo Cruz


1
以来Python 3.8、あなたは、環境変数を使用することができます場所変更:迷惑なキャッシュディレクトリのstackoverflow.com/a/57414308/1612318
Rotareti

キャッシュとは、再び必要になった場合に備えて、元の場所に戻って取得する必要がないように、コピーを保持するものです。元の場所に行くよりも速くなるように設計されています。情報を前処理またはコンパイルする必要がないため、処理が高速になる可能性があります。または、RAMのディスクキャッシュやローカルディスクのWebキャッシュなど、より高速なストレージの場合もあります。それは(それが時々することもできるが)暗号化され、その性質によってではありません、それは常に「似たファイルのファイル」ではない-それはなどのファイル、ファイルのロード、RAMのブロックすることができ
rjmunro

回答:


518

pythonでプログラムを実行すると、インタープリターはまずそれをバイトコードにコンパイルし(これは単純化しすぎです)、それを__pycache__フォルダーに格納します。そこを見ると、プロジェクトのフォルダにある.pyファイルの名前を共有しているファイルの束が見つかります。拡張子のみが.pycまたは.pyoになります。これらはそれぞれ、プログラムのファイルのバイトコードでコンパイルされたバージョンと最適化されたバイトコードでコンパイルされたバージョンです。

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

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

python -B foo.py

tcaswellで指摘されている別のオプションは、環境変数PYTHONDONTWRITEBYTECODEを任意の値に設定することです(Pythonのマニュアルページによると、「空でない文字列」)。


48
環境変数PYTHONDONTWRITEBYTECODE=<any_value>を追加して、永続的に抑制することもできます。
Mark Tolonen 2013年

11
明確にするために、これはPython 3のみを対象としています。
ジョーJ

11
@JoeJはい、私はそれが本当だと思います。python2間違っていない場合は、コンパイルしたファイルを元のファイルと同じディレクトリに配置します。
scott_fakename 2014

27
重要な注意点の1つは、.pyファイルが見つからない場合、.pyファイルの代わりにキャッシュされた.pycファイルが使用されることです。実際には、これはモジュールを削除(または名前変更)した場合にのみ発生するため、一般的なことではありませんが、何かを "そこに"続けている場合は、頭をひっかいて、findを実行します。-name * .pyc | ソースのxargs rmはおそらく良い最初の反応です。
yacc143 2014

34
find . -name '*.pyc' -deleteはい、findには見つかったファイルを削除するためのフラグがあるため、xargs shananigansを使用する必要はありません
vlad-ardelean

174

__pycache__コンパイルされ、実行する準備ができているPython 3バイトコードを含むフォルダです。

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

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


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

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

交換する__pycache__*.pycPythonの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 && ...'

これは、コードを実行するたびに元に戻されませんか?
Holloway

2
@DoTheEvo:それは単に作成されないので、モジュールが次にロードされるときの高速化はありません。エラーは発生しません。
Petr Viktorin 2015

7
これは良い答えではありません。質問者は、これらのファイルの目的を知りたいと考えています。この答えは「心配しないで」と言ってから、それらを消し去ります。
興味深いことに、

36
絶対にこれらを削除する必要はありません。それは無意味ではありません。Pythonは多くの状況でファイルの変更を検出せず、キャッシュファイルを実行します。「fがまだ機能しない理由、コードを変更した理由、存在しない呼び出しで依然として失敗する理由」というナンセンスで壁を押し上げます。特にテストフレームワークでは、pycache-by-defaultが最悪です。
マイク 'Pomax'カマーマンズ

2
私は「これらのファイルを削除する手間を省く」というこのアドバイスに同意しません-これは何度も推奨されていますが、最近ではKenneth Reitzの「How To Python」(「バイトコードトリック」)
Louis Maddox

38

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

import file_name

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


27

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を参照してください。

5

公式の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のバイナリに依存真ん中コンポーネントとを、。


5

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

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


3

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

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

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


3

Pythonバージョン2.xには、インタープリターがコードをコンパイルするときに.pycが含まれます。

Pythonバージョン3.xには、インタープリターがコードをコンパイルするときに__pycache__があります。

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$

2

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


pycache」フォルダの作成を回避するにはどうすればよいですか。すべての.pycは.pyファイルと同じ名前にする必要がありますか?
アシュワニ

1

モジュールインポートすると

import file_name

Pythonはコンパイルされたバイトコードを__pycache__ディレクトリに保存するため、将来のインポートでは、ソースを再度解析してコンパイルする必要がなく、直接使用できます。

スクリプトを実行するだけの場合は、ファイルがインポートされたときにのみ実行されます。

(以前のバージョンでは、キャッシュされたバイトコードを.pycファイルとして保存していましたが、.pyファイルと同じディレクトリに散らばっていましたが、Python 3以降では、より整然とするためにサブディレクトリに移動しました。)

PYTHONDONTWRITEBYTECODE --->空でない文字列に設定されている場合、Pythonはソースモジュールのインポート時に.pycファイルを書き込もうとしません。これは、-Bオプションを指定することと同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.