Python3 projesi __pycache__ klasörlerini ve .pyc dosyalarını kaldırın


166

Bir python3 projesinden tüm __pycache__ klasörleri ve .pyc/.pyodosyaları temizlemenin EN İYİ yolu nedir . Birden fazla kullanıcının pycleanDebian ile birlikte komut dosyası önerdiğini gördüm , ancak bu klasörleri kaldırmaz. Dosyaları DVS'ime göndermeden önce projeyi temizlemenin basit bir yolunu istiyorum.

Yanıtlar:


241

Bir sonraki komutla manuel olarak yapabilirsiniz:

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

Bu işlem , geçerli dizindeki tüm * .pyc dosyalarını ve __pycache__ dizinlerini özyinelemeli olarak kaldıracaktır .


8
Komut kirli. Ayrıca silecektir *__pycache__, *.pyc*ve dosyaları ve dizinleri arasında ayrım yapmaz. Oluşturulan rmkomutların çoğu gereksiz olacaktır.
ivan_pozdeev

12
Bu sadece yanlış. Bu nasıl kullanmak findne de grepne rmve herhangi bir geçerli çalışma dizini useful.pycle.jsonveya important_deployment_setting_about__pycache__.txtvb içerebilir tehlikeli olabilir . Hangi SO tüm kullanıcı tabanına ekarte olmaz. Adında boşluk olan bir dosya tarafından nasıl (tehlikeli rm -rf) kırık olduğunu xargsbelirtmemek gerekir. Bu yüzden ben düzenledim…
dlamblin

@ dwanderson Bence farklı bir cevaptan bahsediyorsunuz; ya da SO düzenleme geçmişi artık tam geçmişi göstermiyor EG 2017'de burada gösterilmeyen bir sürüm var mı?
dlamblin

2
OSX üzerinde çalışmazgrep: parentheses not balanced
Daniel W.

85

Pycclean'ı pycclean olarak yanlış yazdığımda cevabı kendim buldum:

    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

Koşu py3clean .çok güzel temizlendi.


6
py3clean @ V.Gamula'nın komutundan daha muhafazakardır: o zamandan beri silinen kaynak dosyalarından oluşturulan .pyc dosyalarını silmez.
Jérôme

1
Mayıs / 2017 itibariyle, macos / homebrew'da pip'ten pakette yer alan pycleaner'ı kullanmak zorunda kaldım ve onu yürütme komutu pycleaner. Yalnızca Python 2.
Willian Mitsuda

3
python3-minimal sadece Debian'da mevcut gibi görünüyor (RHEL, CentOS, demlemek,
MacOS'ta bulamıyor

1
garip bir şekilde, benim yüklü py3clean (3.5.1-3) aslında hiçbir şey yapmaz, bu dosyaların hiçbirini temizler ve sessizce geri döner (python 3.6.5).
matanster

4
__pycache__Klasörleri veya .pycdosyaları silmez (
debian'da

82

macOS ve Linux

BSD'lerin findMacOS üzerinde uygulama GNU find farklıdır - bu BSD ve GNU bulmak hem uyumludur. Kullanarak, bir globbing uygulanması ile başlayın -nameve -oiçin ya - da bu işlevi koyun .bashrcdosyası:

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

Ardından cd, yinelemeli olarak temizlemek istediğiniz dizine gidin ve yazınpyclean .

Yalnızca GNU bulma

Bu bir GNU bulma, sadece (yani Linux) çözümüdür, ancak normal ifadeyle biraz daha hoş olduğunu düşünüyorum:

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

Python 3 kullanan herhangi bir platform

Windows'da, muhtemelen yoktur find. Bununla birlikte, muhtemelen 3.4'ten başlayarak uygun pathlibmodüle sahip Python 3'e sahipsiniz :

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

-BBayrak yazmak için değil Python söyler .pycdosyaları. (Ayrıca bkz.PYTHONDONTWRITEBYTECODE Ortam değişkeni.)

Yukarıdaki ihlaller döngü için kavrayışları listeler, ancak kullanırken python -cstil oldukça ikincil bir endişedir. Alternatif olarak kötüye kullanabiliriz (örneğin) __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()"

Bir yanıtın eleştirisi

İlk cevap şöyle derdi:

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

Üç süreç kullandığından, bu daha az verimli görünmektedir. finddüzenli bir ifade alır, bu yüzden ayrı bir çağrıya ihtiyacımız yoktur grep. Benzer şekilde, -deleteayrı bir çağrıya ihtiyacımız yok rm- ve buradaki bir yorumun aksine , onlar düzenli ifade maçın sayesinde boşaltılmış olsun sürece boş olmayan dizinleri silin.

Gönderen xargsadam sayfası:

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

/ Tmp dizininde veya altında core adlı dosyaları bulun ve önceki örnekten daha verimli bir şekilde silin (çünkü rm'yi başlatmak için fork (2) ve exec (2) kullanma ihtiyacından kaçınırız ve ekstra xargs işlemi).


Muhtemelen kullanarak bir satıra piton versiyonunu alabilir shutil.rmteeüzerinde __pycache__yerine önce onları boşaltma dizinleri; tek bir satır kolay bir takma ad için iyi olabilir. Ben Pathşu anda büyük bir hayranıyım , bu yüzden bence bu sürümü senaryomda kullanacağım.
Nathan

25

Bu bir Python 3 projesi olduğundan, sadece __pycache__dizinleri silmeniz gerekir - tüm .pyc/ .pyodosyalar bunların içindedir.

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

ya da daha basit haliyle,

find . -type d -name __pycache__ -delete

hangi benim için bir nedenle işe yaramadı (dosyalar silindi ama dizinler değildi), bu yüzden her ikisi de tamlık uğruna dahil ediyorum.


Alternatif olarak, bunu düzeltme denetimi altındaki bir dizinde yapıyorsanız, RCS'ye __pycache__klasörleri yinelemeli olarak yok saymasını söyleyebilirsiniz . Ardından, gerekli anda, yok sayılan tüm dosyaları temizleyin. Bu muhtemelen daha uygun olacaktır, çünkü muhtemelen temizlenmesi gerekenlerden daha fazlası olacaktır __pycache__.


Hayır, tüm .pycdosyalar onun içinde değil.
Martin Thoma

@ V.Gamula Bu ~ 114 kişinin yeterince şanslı olduğundan daha güvenli bir emirdir ve onları yanlış bir maçın kalıcı olarak silinmesiyle ısırmamıştır.
dlamblin

Sadece bir python3 projesinde @MartinThoma?
dlamblin

4
Directory not emptyBuradaki ikinci varyantla ben ilgilenen tek kişi miyim ?
matanster

13

Bu, Python 2 ve Python 3 ile birlikte çalışan tüm takma adımdır, tüm .pyc .pyodosyaları ve __pycache__dizinleri tekrar tekrar kaldırır .

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

Çok teşekkürler. Depolarım için gereksiz dosyalardan kurtulmama yardımcı oldu.
Harsh Aggarwal

13

Python önbellek dosyalarını proje dizinlerinizin dışında tutmak için kalıcı bir çözüme ihtiyacınız varsa :

Python 3.8 ile başlayarak PythonPYTHONPYCACHEPREFIX için bir önbellek dizini tanımlamak için ortam değişkenini kullanabilirsiniz .

Python belgelerinden:

Bu ayar yapılırsa, Python .pyc dosyalarını kaynak ağaçtaki pycache dizinleri yerine bu yoldaki bir ayna dizin ağacına yazar . Bu, -X pycache_prefix = PATH seçeneğini belirtmeye eşdeğerdir.

Misal

./profileLinux'taki şu satırı eklerseniz :

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

Python __pycache__proje dizininizde can sıkıcı dizinler oluşturmaz , bunun yerine hepsini altına koyar~/.cache/cpython/


4
Çok şükür bu geliyor. Pycache çöp dizinleri bir gaf idi.
Sarah G

7

Kullandığım komut:

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

açıklar:

  1. İlk __pycache__önce geçerli dizindeki tüm klasörleri bulur .

  2. rm -r {} +Yukarıdaki adımda her klasörü silmek için yürütün ( {} yer tutucuyu belirtin ve +komutu sonlandırın)

Düzenleme 1:

Linux kullanıyorum, aşağıdaki satırı ~/.bashrcdosyaya eklediğim komutu yeniden kullanmak için

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

Düzenlendi 2: VS Kodu kullanıyorsanız , __pycache__manuel olarak kaldırmanız gerekmez . Aşağıdaki snippet'i settings.jsondosyaya ekleyebilirsiniz . Bundan sonra, VS Kodu__pycache__ sizin için tüm klasörleri gizleyecektir

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

Umarım yardımcı olur !!!


4

PyCharm'ı kullanma

Derlenmiş Python dosyalarını kaldırmak için

  1. Olarak Project Tool Window, Python derlenmiş dosyalar silinir gereken bir proje veya dizini sağ tıklatın.

  2. Bağlam menüsünde öğesini seçin Clean Python compiled files.

.pycSeçilen dizinde bulunan dosyalar sessizce silinir.


4

Proje dizininden aşağıdakileri yazın:

Tüm .pyc dosyalarını silme

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

Tüm .pyo dosyalarını silme :

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

Son olarak, tüm '__pycache__' yi silmek için şunu yazın:

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

İzin verilmedi hatası ile karşılaşırsanız , yukarıdaki komutun başına sudo ekleyin .


2

Diğer cevaplar için çok teşekkürler, onlara dayanarak Debian paketimin prermdosyası için kullandığım şey :

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

Neden sadece kullanmıyorsunuz rm -rf __pycache__? Run git add -Asizin deposundan çıkarıp ve eklenecek sonradan __pycache__/sizin .gitignore dosyasına.


1
Bunu elle yapmıyor. Debian paketinde kullanılan bir senaryoya eklemeye çalışıyor. Bir debian paketi git ile değil, debian paket yöneticisi veya apt yükleyicisiyle birlikte kullanılır.
Craig

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.