web-dev-qa-db-ja.com

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

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

104
SalientGreen

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 .を実行すると、非常にきれいになりました。

67
SalientGreen

次のコマンドを使用して手動で実行できます。

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

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

167
V. Gamula

macOSおよびLinux

BSDのmacOSでのfind実装は、GNU findとは異なります-これは、BSDとGNU findの両方と互換性があります。 または-nameおよび-oを使用して、グロビング実装を開始します。この関数を.bashrcファイルに追加します。

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

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

GNU検索のみ

これはGNU find、only(i.e. Linux)ソリューションですが、正規表現の方が少しいいと感じています:

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

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

Windowsでは、おそらくfindもありません。ただし、おそらくPython 3があり、3.4からは便利なpathlibモジュールがあります。

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

これはループのリスト内包表記を乱用しますが、python -cを使用する場合、スタイルはむしろ二次的な懸念事項です。または、(たとえば)__import__を悪用することもできます。

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

回答の批判

かつて言ったトップの答え:

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

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

xargs manページから:

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

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

45
Aaron Hall

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

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

またはその単純な形式、

find . -type d -name __pycache__ -delete

これは何らかの理由で機能しませんでした(ファイルは削除されましたが、ディレクトリは機能しませんでした)。そのため、完全を期すために両方を含めています。


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

16
ivan_pozdeev

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

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

プロジェクトディレクトリからPythonキャッシュファイルを除外するために永続的な解決策が必要な場合:

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

Pythonドキュメントから:

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

Linuxで./profileに次の行を追加する場合:

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

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

1
Rotareti

他の回答に感謝します、それらに基づいて、これは私の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
1
Craig

PyCharmを使用する

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

  1. Project Tool Windowで、Pythonコンパイル済みファイルを削除するプロジェクトまたはディレクトリを右クリックします。

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

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

0
AB Abhi

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

0
Bachsau