Proyek Python3 menghapus folder __pycache__ dan file .pyc


166

Apa cara TERBAIK untuk menghapus semua __pycache__ folder dan .pyc/.pyofile dari proyek python3. Saya telah melihat banyak pengguna menyarankan pycleanskrip yang dibundel dengan Debian, tetapi ini tidak menghapus folder. Saya ingin cara sederhana untuk membersihkan proyek sebelum mendorong file ke DVS saya.

Jawaban:


241

Anda dapat melakukannya secara manual dengan perintah berikut:

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

Ini akan menghapus semua file * .pyc dan direktori __pycache__ secara rekursif di direktori saat ini.


8
Perintahnya kotor. Itu juga akan menghapus *__pycache__, *.pyc*dan itu tidak membedakan antara file dan direktori. Sebagian besar rmperintah yang dihasilkan juga akan berlebihan.
ivan_pozdeev

12
Ini salah. Itu bukan cara Anda menggunakan findatau greptidak rmdan itu bisa berbahaya untuk direktori kerja saat ini yang mungkin berisi useful.pycle.jsonatau important_deployment_setting_about__pycache__.txtlain - lain. Saya tidak akan mengesampingkan seluruh basis pengguna SO. Belum lagi bagaimana (berbahaya rm -rf) xargsakan rusak oleh file dengan spasi putih dalam nama. Jadi saya mengeditnya ...
dlamblin

@wanderson Saya pikir Anda sedang berbicara tentang jawaban yang berbeda; atau apakah SO mengedit riwayat tidak lagi menampilkan riwayat lengkap EG ada versi pada tahun 2017 yang tidak ditampilkan di sana?
dlamblin

2
Tidak berfungsi di OSXgrep: parentheses not balanced
Daniel W.

85

Saya menemukan jawabannya sendiri ketika saya salah mengetik pyclean sebagai 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

Berjalan py3clean .membersihkannya dengan sangat baik.


6
py3clean lebih konservatif daripada perintah @ V.Gamula: ia tidak menghapus file .pyc yang dihasilkan dari file sumber yang telah dihapus sejak itu.
Jérôme

1
Pada Mei / 2017, di macos / homebrew, saya harus menggunakan paket pycleaner dari pip, dan perintah untuk menjalankannya adalah pycleaner. Hanya Python 2.
Willian Mitsuda

3
python3-minimal tampaknya hanya tersedia di Debian (tidak menemukannya di RHEL, CentOS, brew, MacOS)
user12345

1
anehnya, py3clean saya yang terinstal (3.5.1-3) tidak melakukan apa-apa sebenarnya, tidak menghapus file-file itu dan secara diam-diam mengembalikan (python 3.6.5).
matanster

4
Itu tidak menghapus __pycache__folder, atau .pycfile (diuji pada debian)
EricLavault

82

macOS & Linux

findImplementasi BSD pada macOS berbeda dari GNU find - ini kompatibel dengan BSD dan GNU find. Mulailah dengan implementasi globbing, gunakan -namedan -ountuk atau - Letakkan fungsi ini di .bashrcfile Anda :

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

Kemudian cdke direktori yang ingin Anda bersihkan secara rekursif, dan ketik pyclean.

GNU hanya menemukan

Ini adalah solusi GNU find, only (yaitu Linux), tapi saya merasa ini sedikit lebih baik dengan regex:

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

Platform apa pun, menggunakan Python 3

Di Windows, Anda mungkin tidak memilikinya find. Namun, Anda mungkin memiliki Python 3, yang dimulai pada 3.4 memiliki pathlibmodul yang mudah digunakan :

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__')]"

The -Bbendera memberitahu Python untuk tidak menulis .pycfile. (Lihat juga PYTHONDONTWRITEBYTECODEvariabel lingkungan.)

Daftar pelanggaran di atas memahami perulangan, tetapi saat menggunakan python -c, gaya agak menjadi perhatian sekunder. Sebagai alternatif, kami dapat menyalahgunakan (misalnya) __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()"

Kritik atas jawaban

Jawaban teratas biasanya mengatakan:

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

Ini tampaknya kurang efisien karena menggunakan tiga proses. findmengambil ekspresi reguler, jadi kami tidak perlu doa terpisah grep. Demikian pula, sudah -delete, jadi kita tidak perlu doa terpisah rm- dan bertentangan dengan komentar di sini, itu akan menghapus direktori tidak kosong selama mereka dikosongkan berdasarkan pertandingan ekspresi reguler.

Dari xargshalaman manual:

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

Temukan file dengan nama core di atau di bawah direktori / tmp dan hapus, tetapi lebih efisien daripada di contoh sebelumnya (karena kita menghindari kebutuhan untuk menggunakan fork (2) dan exec (2) untuk meluncurkan rm dan kita tidak memerlukan proses xargs ekstra).


Anda mungkin bisa mendapatkan versi python untuk satu baris dengan menggunakan shutil.rmteepada __pycache__direktori bukan mengosongkan mereka pertama; one-liner mungkin bagus untuk alias yang mudah. Saya penggemar berat Pathsaat ini, jadi saya pikir saya akan menggunakan versi itu dalam skrip saya.
Nathan

25

Karena ini adalah proyek Python 3, Anda hanya perlu menghapus __pycache__direktori - semua .pyc/ .pyofile ada di dalamnya.

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

atau bentuknya yang lebih sederhana,

find . -type d -name __pycache__ -delete

yang tidak berfungsi untuk saya karena beberapa alasan (file dihapus tetapi direktori tidak), jadi saya menyertakan keduanya demi kelengkapan.


Atau, jika Anda melakukan ini di direktori yang berada di bawah kendali revisi, Anda dapat meminta RCS untuk mengabaikan __pycache__folder secara rekursif. Kemudian, pada saat yang diperlukan, cukup bersihkan semua file yang diabaikan. Ini mungkin akan lebih nyaman karena mungkin akan ada lebih banyak untuk dibersihkan daripada sekadar __pycache__.


Tidak, tidak semua .pycfile ada di dalamnya.
Martin Thoma

@ V. Gramula Ini adalah perintah yang jauh lebih aman daripada yang ~ 114 orang cukup beruntung tidak menggigit mereka dengan penghapusan permanen dari pertandingan yang salah.
dlamblin

@ MartinThoma hanya dalam proyek python3?
dlamblin

4
Apakah saya satu-satunya yang mendapatkan Directory not emptyvarian kedua di sini?
matanster

13

Ini adalah alias saya yang berfungsi baik dengan Python 2 dan Python 3 menghapus semua .pyc .pyofile juga __pycache__direktori secara rekursif.

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

Terima kasih banyak. Ini membantu saya untuk menyingkirkan semua file yang tidak perlu untuk repo saya.
Harsh Aggarwal

13

Jika Anda memerlukan solusi permanen untuk menjaga file cache Python dari direktori proyek Anda:

Dimulai dengan Python 3.8 Anda dapat menggunakan variabel lingkungan PYTHONPYCACHEPREFIXuntuk menentukan direktori cache untuk Python.

Dari dokumen Python:

Jika ini disetel, Python akan menulis file .pyc di pohon direktori mirror di jalur ini, alih-alih dalam direktori pycache di dalam pohon sumber. Ini sama dengan menentukan opsi -X pycache_prefix = PATH.

Contoh

Jika Anda menambahkan baris berikut ke ./profileLinux Anda:

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

Python tidak akan membuat __pycache__direktori yang menjengkelkan di direktori proyek Anda, sebaliknya itu akan menempatkan semuanya~/.cache/cpython/


4
Syukurlah ini akan datang. Direktori pycache litter adalah kesalahan besar.
Sarah G

7

Perintah yang saya gunakan:

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

Menjelaskan:

  1. Pertama menemukan semua __pycache__folder di direktori saat ini.

  2. Jalankan rm -r {} +untuk menghapus setiap folder pada langkah di atas ( {} menandakan placeholder dan +mengakhiri perintah)

Diedit 1:

Saya menggunakan Linux, untuk menggunakan kembali perintah saya telah menambahkan baris di bawah ini ke ~/.bashrcfile

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

Diedit 2: Jika Anda menggunakan Kode VS , Anda tidak perlu menghapus __pycache__secara manual. Anda dapat menambahkan potongan di bawah ini ke settings.jsonfile. Setelah itu, VS Code akan menyembunyikan semua __pycache__folder untuk Anda

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

Semoga bisa membantu !!!


4

Menggunakan PyCharm

Untuk menghapus file yang dikompilasi Python

  1. Di Project Tool Window, klik kanan proyek atau direktori, tempat file yang dikompilasi Python harus dihapus.

  2. Pada menu konteks, pilih Clean Python compiled files.

The .pycfile yang berada di direktori yang dipilih diam-diam dihapus.


4

Dari direktori proyek ketik yang berikut ini:

Menghapus semua file .pyc

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

Menghapus semua file .pyo :

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

Akhirnya, untuk menghapus semua '__pycache__' , ketik:

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

Jika Anda mengalami kesalahan yang ditolak izin , tambahkan sudo di awal semua perintah di atas.


2

Terima kasih banyak atas jawaban lain, berdasarkan pada mereka inilah yang saya gunakan untuk prermfile paket Debian saya :

#!/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

Kenapa tidak pakai saja rm -rf __pycache__? Jalankan git add -Asesudahnya untuk menghapusnya dari repositori Anda dan tambahkan __pycache__/ke file .gitignore Anda.


1
Dia tidak melakukan ini secara manual. Dia mencoba menambahkannya ke skrip yang digunakan dalam paket Debian. Paket debian tidak digunakan dengan git tetapi dengan manajer paket debian atau installer apt.
Craig

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.