python3プロジェクトからすべての__pycache__
フォルダーと.pyc/.pyo
ファイルを削除する最良の方法は何ですか。複数のユーザーpyclean
がDebianにバンドルされているスクリプトを提案しているのを見てきましたが、これはフォルダーを削除しません。ファイルをDVSにプッシュする前にプロジェクトをクリーンアップする簡単な方法が必要です。
python3プロジェクトからすべての__pycache__
フォルダーと.pyc/.pyo
ファイルを削除する最良の方法は何ですか。複数のユーザーpyclean
がDebianにバンドルされているスクリプトを提案しているのを見てきましたが、これはフォルダーを削除しません。ファイルをDVSにプッシュする前にプロジェクトをクリーンアップする簡単な方法が必要です。
回答:
次のコマンドで手動で行うことができます:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
これにより、現在のディレクトリにあるすべての* .pycファイルと__pycache__ディレクトリが再帰的に削除されます。
find
たりgrep
もrm
、それが含まれている可能性のある現在の作業ディレクトリのために危険なことができuseful.pycle.json
たりimportant_deployment_setting_about__pycache__.txt
、私はSOの全体のユーザーベースに排除しないであろうなど。(危険なことにrm -rf
)壊れたのxargs
は、名前に空白が含まれているファイルが原因であることは言うまでもありません。それで私はそれを編集しました…
grep: parentheses not balanced
私は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 .
と、非常にきれいにクリーンアップされました。
__pycache__
フォルダーも.pyc
ファイルも削除されません(debianでテスト済み)
find
macOSでのBSDの実装はGNU findとは異なります-これはBSDとGNU findの両方と互換性があります。-name
andの-o
for または - を使用したグロビング実装から始め.bashrc
ます。この関数をファイルに追加します。
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
次にcd
、再帰的にクリーンアップするディレクトリに、と入力しpyclean
ます。
これは、GNU findのみ(つまりLinux)の解決策ですが、正規表現を使用すると少し良いと感じます。
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
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
ここでのコメントとは異なり、正規表現の一致によって空でない限り、空ではないディレクトリが削除されます。
xargs
manページから:
find /tmp -depth -name core -type f -delete
/ tmpディレクトリ以下のcoreという名前のファイルを検索して削除しますが、前の例よりも効率的です(rmを起動するためにfork(2)とexec(2)を使用する必要がなく、追加のxargsプロセス)。
shutil.rmtee
、__pycache__
ディレクトリでを使用することにより、Pythonバージョンを1行にすることができます。簡単なエイリアスとしては、ワンライナーが良いでしょう。でも今は大ファンなPath
ので、スクリプトではそのバージョンを使用するつもりです。
これはPython 3プロジェクトであるため、__pycache__
ディレクトリを削除するだけで済みます。すべての.pyc
/ .pyo
ファイルはその中にあります。
find . -type d -name __pycache__ -exec rm -r {} \+
またはそのより単純な形式、
find . -type d -name __pycache__ -delete
何らかの理由でこれは機能しませんでした(ファイルは削除されましたが、ディレクトリは機能しませんでした)。
または、リビジョン管理されているディレクトリでこれを行う場合、RCSに__pycache__
フォルダーを再帰的に無視するように指示できます。次に、必要なときに、無視されたすべてのファイルをクリーンアップします。クリーンアップする必要があるのはおそらくだけではないので、これはおそらく便利__pycache__
です。
.pyc
ファイルがその中にあるわけではありません。
Directory not empty
ここで2番目のバリアントを取得できるのは私だけですか?
これは、すべての.pyc .pyo
ファイルと__pycache__
ディレクトリを再帰的に削除するPython 2とPython 3の両方で機能する私のエイリアスです。
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オプションを指定するのと同じです。
例
./profile
Linuxで次の行を追加すると、
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Pythonは__pycache__
プロジェクトディレクトリに迷惑なディレクトリを作成せず、代わりにそれらすべてを~/.cache/cpython/
私が使用したコマンド:
find . -type d -name "__pycache__" -exec rm -r {} +
説明:
最初に__pycache__
、現在のディレクトリですべてのフォルダを検索します。
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
}
それが役に立てば幸い !!!
他の回答に感謝します。それらに基づいて、これは私の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
ターミナルに行き、次のように入力してください:
$rm __pycache__
削除されます。
*__pycache__
、*.pyc*
を削除し、ファイルとディレクトリを区別しません。生成されたrm
コマンドのほとんども不要です。