Python3プロジェクトは__pycache__フォルダーと.pycファイルを削除します


166

python3プロジェクトからすべての__pycache__ フォルダーと.pyc/.pyoファイルを削除する最良の方法は何ですか。複数のユーザーpycleanがDebianにバンドルされているスクリプトを提案しているのを見てきましたが、これはフォルダーを削除しません。ファイルをDVSにプッシュする前にプロジェクトをクリーンアップする簡単な方法が必要です。

回答:


241

次のコマンドで手動で行うことができます:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

これにより、現在のディレクトリにあるすべての* .pycファイルと__pycache__ディレクトリが再帰的に削除されます。


8
コマンドがダーティです。また*__pycache__*.pyc*を削除し、ファイルとディレクトリを区別しません。生成されたrmコマンドのほとんども不要です。
ivan_pozdeev 2017年

12
これは間違っています。それはあなたが使用する方法はありませんfindたりgreprm、それが含まれている可能性のある現在の作業ディレクトリのために危険なことができuseful.pycle.jsonたりimportant_deployment_setting_about__pycache__.txt、私はSOの全体のユーザーベースに排除しないであろうなど。(危険なことにrm -rf)壊れたのxargsは、名前に空白が含まれているファイルが原因であることは言うまでもありません。それで私はそれを編集しました…
dlamblin

@dwanderson私はあなたが別の答えについて話していると思います。または、SOの編集履歴には完全な履歴が表示されなくなります。たとえば、2017にそこに表示されていないバージョンがあった場合はどうなりますか?
dlamblin 2018年

2
OSXでは動作しませんgrep: parentheses not balanced
ダニエルW.

85

私はpycleanをpyccleanと誤って入力したときに自分で答えを見つけました:

    No command 'pycclean' found, did you mean:
     Command 'py3clean' from package 'python3-minimal' (main)
     Command 'pyclean' from package 'python-minimal' (main)
    pycclean: command not found

実行するpy3clean .と、非常にきれいにクリーンアップされました。


6
py3cleanは、@ V.Gamulaのコマンドよりも保守的です。それ以降、削除されたソースファイルから生成された.pycファイルは削除されません。
ジェローム2016年

1
may / 2017現在、macos / homebrewでは、pipからパッケージpycleanerを使用する必要があり、それを実行するコマンドはpycleanerです。Python 2のみ。
ウィリアン・

3
python3-minimalはDebianでのみ利用できるようです(RHEL、CentOS、brew、MacOSでは見つかりません)
user12345

1
奇妙なことに、私のインストールしたpy3clean(3.5.1-3)は実際には何もせず、それらのファイルはどれも消去せず、単に黙って返されます(python 3.6.5)。
マタンスター

4
__pycache__フォルダーも.pycファイルも削除されません(debianでテスト済み)
EricLavault

82

macOSおよびLinux

findmacOSでのBSDの実装はGNU findとは異なります-これはBSDとGNU findの両方と互換性があります。-nameandの-ofor または - を使用したグロビング実装から始め.bashrcます。この関数をファイルに追加します。

pyclean () {
    find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}

次にcd、再帰的にクリーンアップするディレクトリに、と入力しpycleanます。

GNU検索専用

これは、GNU findのみ(つまりLinux)の解決策ですが、正規表現を使用すると少し良いと感じます。

pyclean () {
    find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}

Python 3を使用する任意のプラットフォーム

Windowsでは、おそらくもありませんfind。ただし、Python 3を使用している可能性がありpathlibます。これには、3.4以降の便利なモジュールがあります。

python3 -Bc "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"

この-Bフラグは、Pythonに.pycファイルを書き込まないように指示します。(PYTHONDONTWRITEBYTECODE環境変数も参照してください。)

上記は、ループの理解度を乱用していますが、を使用する場合python -c、スタイルはむしろ二次的な問題です。あるいは、乱用することもできます(たとえば)__import__

python3 -Bc "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('__pycache__'): p.rmdir()"

答えの批評

よく使われる答えは次のとおりです。

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

3つのプロセスを使用するため、これは効率が悪いようです。findは正規表現を使用するため、を個別に呼び出す必要はありませんgrep。同様に、が-deleteあるので、個別に呼び出す必要はありません。rmここでのコメントとは異なり、正規表現の一致によって空でない限り、空ではないディレクトリ削除されます。

xargsmanページから:

find /tmp -depth -name core -type f -delete

/ tmpディレクトリ以下のcoreという名前のファイルを検索して削除しますが、前の例よりも効率的です(rmを起動するためにfork(2)とexec(2)を使用する必要がなく、追加のxargsプロセス)。


最初に空にするのではなくshutil.rmtee__pycache__ディレクトリでを使用することにより、Pythonバージョンを1行にすることができます。簡単なエイリアスとしては、ワンライナーが良いでしょう。でも今は大ファンなPathので、スクリプトではそのバージョンを使用するつもりです。
ネイサン

25

これはPython 3プロジェクトであるため、__pycache__ディレクトリを削除するだけで済みます。すべての.pyc/ .pyoファイルはその中にあります。

find . -type d -name __pycache__ -exec rm -r {} \+

またはそのより単純な形式、

find . -type d -name __pycache__ -delete

何らかの理由でこれは機能しませんでした(ファイルは削除されましたが、ディレクトリは機能しませんでした)。


または、リビジョン管理されているディレクトリでこれを行う場合、RCSに__pycache__フォルダーを再帰的に無視するように指示できます。次に、必要なときに、無視されたすべてのファイルをクリーンアップします。クリーンアップする必要があるのはおそらくだけではないので、これはおそらく便利__pycache__です。


いいえ、すべての.pycファイルがその中にあるわけではありません。
Martin Thoma

@ V.Gamulaこれは、運が良かった114人が、誤った一致を永久に削除して噛まなかったよりもかなり安全なコマンドです。
dlamblin 2018年

python3のみのプロジェクトの@MartinThoma?
dlamblin 2018年

4
Directory not emptyここで2番目のバリアントを取得できるのは私だけですか?
マタンスター

13

これは、すべての.pyc .pyoファイルと__pycache__ディレクトリを再帰的に削除するPython 2とPython 3の両方で機能する私のエイリアスです。

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'

どうもありがとう。それは私が私のリポジトリに不要なファイルをすべて取り除くのに役立ちました。
Harsh Aggarwal

13

Pythonキャッシュファイルをプロジェクトディレクトリから除外する永続的なソリューションが必要な場合:

Python 3.8以降では、環境変数PYTHONPYCACHEPREFIXを使用してPythonのキャッシュディレクトリを定義できます。

Pythonのドキュメントから:

これが設定されている場合、Pythonは、ソースツリー内のpycacheディレクトリではなく、このパスのミラーディレクトリツリーに.pycファイルを書き込みます。これは、-X pycache_prefix = PATHオプションを指定するのと同じです。

./profileLinuxで次の行を追加すると、

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

Pythonは__pycache__プロジェクトディレクトリに迷惑なディレクトリを作成せず、代わりにそれらすべてを~/.cache/cpython/


4
これが来ている善ありがとうございます。pycacheのリターディレクトリは失態でした。
サラG

7

私が使用したコマンド:

find . -type d -name "__pycache__" -exec rm -r {} +

説明:

  1. 最初に__pycache__、現在のディレクトリですべてのフォルダを検索します。

  2. rm -r {} +上記のステップで各フォルダーを削除するために実行します({} プレースホルダーを示し+、コマンドを終了します)

編集1:

私はLinuxを使用してい~/.bashrcますが、ファイルに以下の行を追加したコマンドを再利用します

alias rm-pycache='find . -type d -name  "__pycache__" -exec rm -r {} +'

編集2:VS Code を使用している場合、__pycache__手動で削除する必要はありません。以下のスニペットをsettings.jsonファイルに追加できます。その後、VS Codeはすべての__pycache__フォルダーを非表示にします

"files.exclude": {
     "**/__pycache__": true
}

それが役に立てば幸い !!!


4

PyCharmの使用

Pythonコンパイル済みファイルを削除するには

  1. ではProject Tool Window、Pythonのコンパイルされたファイルをから削除されなければならないプロジェクトまたはディレクトリを、右クリックします。

  2. コンテキストメニューで、を選択しますClean Python compiled files

.pyc選択したディレクトリにあるファイルは黙って削除されます。


4

プロジェクトディレクトリから次のように入力します。

すべての.pycファイルを削除する

find . -path "*/*.pyc" -delete

すべての.pyoファイルを削除する:

find . -path "*/*.pyo" -delete

最後に、すべての'__pycache__'を削除するには、次のように入力します。

find . -path "*/__pycache__" -type d -exec rm -r {} ';'

権限拒否エラーが発生した場合は、上記のすべてのコマンドの先頭にsudoを追加してください。


2

他の回答に感謝します。それらに基づいて、これは私のDebianパッケージのprermファイルに使用したものです。

#!/bin/sh
set -e

deb_package='package-name'
python_package='package_name'

if which pyclean >/dev/null 2>&1; then
    py3clean -p $deb_package
else
    dpkg -L $deb_package | grep ${python_package}$ | while read file
    do
        find ${file} -type d -name __pycache__ -exec rm -r {} \+
    done
fi

0

なぜ使用しないのrm -rf __pycache__ですか?git add -A後で実行してそれらをリポジトリから削除し__pycache__/、.gitignoreファイルに追加します。


1
彼はこれを手動で行っていません。彼はそれをDebianパッケージで使用されるスクリプトに追加しようとしています。debianパッケージはgitではなく、debianパッケージマネージャーまたはaptインストーラーで使用されます。
クレイグ

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