Python3プロジェクトからすべての__pycache__
フォルダーと.pyc/.pyo
ファイルを消去する最良の方法は何ですか。複数のユーザーがDebianにバンドルされているpyclean
スクリプトを提案しているのを見てきましたが、これはフォルダーを削除しません。 DVSにファイルをプッシュする前にプロジェクトをクリーンアップする簡単な方法が必要です。
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 .
を実行すると、非常にきれいになりました。
次のコマンドを使用して手動で実行できます。
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
これにより、現在のディレクトリのすべての*。pycファイルと_ PYCACHE _ディレクトリが再帰的に削除されます。
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 find、only(i.e. Linux)ソリューションですが、正規表現の方が少しいいと感じています:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
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プロセス)。
これはPython 3プロジェクトなので、__pycache__
ディレクトリのみを削除する必要があります。すべての.pyc
/.pyo
ファイルはその中にあります。
find . -type d -name __pycache__ -exec rm -r {} \+
またはその単純な形式、
find . -type d -name __pycache__ -delete
これは何らかの理由で機能しませんでした(ファイルは削除されましたが、ディレクトリは機能しませんでした)。そのため、完全を期すために両方を含めています。
あるいは、リビジョン管理下のディレクトリでこれを行う場合、RCSに__pycache__
フォルダーを再帰的に無視するように指示できます。次に、必要なときに、無視されたファイルをすべてクリーンアップします。おそらく__pycache__
よりもクリーンアップする方が多いため、これはおそらくより便利です。
これは私のエイリアスで、Python 2とPython 3の両方で動作し、すべての.pyc .pyo
ファイルと__pycache__
ディレクトリを再帰的に削除します。
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
プロジェクトディレクトリから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/
の下に配置します。
他の回答に感謝します、それらに基づいて、これは私の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
Project Tool Window
で、Pythonコンパイル済みファイルを削除するプロジェクトまたはディレクトリを右クリックします。
コンテキストメニューで、Clean Python compiled files
を選択します。
選択したディレクトリにある.pyc
ファイルは、静かに削除されます。
rm -rf __pycache__
を使用しないのはなぜですか?後でgit add -A
を実行してリポジトリから削除し、__pycache__/
を.gitignoreファイルに追加します。