Projekt Python3 usuwa foldery __pycache__ i pliki .pyc

166

Jaki jest NAJLEPSZY sposób na wyczyszczenie wszystkich __pycache__ folderów i .pyc/.pyoplików z projektu python3. Widziałem, jak wielu użytkowników sugerowało pycleanskrypt dołączony do Debiana, ale to nie usuwa folderów. Chcę w prosty sposób wyczyścić projekt przed wysłaniem plików do mojego DVS.

SalientGreen
źródło

Odpowiedzi:

241

Możesz to zrobić ręcznie za pomocą następującego polecenia:

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

Spowoduje to rekurencyjne usunięcie wszystkich plików * .pyc i katalogów __pycache__ w bieżącym katalogu.

V. Gamula
źródło
8
Polecenie jest brudne. Będzie on również usunąć *__pycache__, *.pyc*i to nie rozróżnia plików i katalogów. Większość wygenerowanych rmpoleceń będzie również zbędna.
ivan_pozdeev
12
To jest po prostu złe. To nie jest jak używać findani grepteż nie rmi może to być niebezpieczne dla każdego aktualnego katalogu roboczego, które mogą zawierać useful.pycle.jsonlub important_deployment_setting_about__pycache__.txtitd. Które nie wyklucza na całej bazy użytkowników tzw. Nie wspominając już o tym, jak (niebezpiecznie rm -rf) xargszostałby uszkodzony plik z białą spacją w nazwie. Więc zredagowałem to…
dlamblin
@dwanderson Myślę, że mówisz o innej odpowiedzi; czy też historia zmian SO nie pokazuje już pełnej historii EG w 2017 była wersja, której tam nie ma?
dlamblin
2
Nie działa na OSXgrep: parentheses not balanced
Daniel W.
85

Sam znalazłem odpowiedź, kiedy błędnie wpisałem pyclean jako 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

Bieganie py3clean .bardzo ładnie to wyczyściło.

SalientGreen
źródło
6
py3clean jest bardziej konserwatywny niż polecenie @ V.Gamula: nie usuwa plików .pyc wygenerowanych z plików źródłowych, które zostały usunięte od tego czasu.
Jérôme
1
Od maja / 2017 roku w macos / homebrew musiałem użyć pakietu pycleaner z pip, a polecenie jego wykonania to pycleaner. Tylko Python 2.
Willian Mitsuda
3
python3-minimal wydaje się być dostępny tylko na Debianie (nie można go znaleźć na RHEL, CentOS, brew, MacOS)
user12345
1
co dziwne, mój zainstalowany py3clean (3.5.1-3) właściwie nic nie robi, nie czyści żadnego z tych plików i po prostu po cichu zwraca (python 3.6.5).
matanster
4
Nie usuwa __pycache__folderów ani .pycplików (testowane na debianie)
EricLavault
82

macOS i Linux

findImplementacja BSD w systemie macOS różni się od funkcji wyszukiwania GNU - jest zgodna zarówno z wyszukiwaniem BSD, jak i GNU. Zacznij od implementacji globalnej, używając -namei -ofor or - Umieść tę funkcję w swoim .bashrcpliku:

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

Następnie cddo katalogu, który chcesz wyczyścić rekurencyjnie, i wpisz pyclean.

Tylko do wyszukiwania GNU

To jest tylko znalezisko GNU (tj. Linux), ale wydaje mi się, że jest trochę ładniejsze z wyrażeniem regularnym:

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

Dowolna platforma, korzystająca z Pythona 3

W systemie Windows prawdopodobnie nawet nie masz find. Prawdopodobnie masz jednak Python 3, który począwszy od 3.4 ma wygodny pathlibmoduł:

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

-BFlaga mówi Python nie pisać .pycplików. (Zobacz także PYTHONDONTWRITEBYTECODEzmienną środowiskową).

Powyższe nadużycia zawierają listę składni do zapętlenia, ale podczas używania python -cstyl jest raczej drugorzędnym problemem. Alternatywnie możemy nadużyć (na przykład) __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()"

Krytyka odpowiedzi

Najlepsza odpowiedź mówiła:

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

Wydawałoby się, że jest to mniej wydajne, ponieważ wykorzystuje trzy procesy. findprzyjmuje wyrażenie regularne, więc nie potrzebujemy osobnego wywołania grep. Podobnie stało -delete, więc nie ma potrzeby oddzielnego wywołanie rm-I przeciwnie do komentarza tutaj, to będzie usuwać niepuste katalogi, tak długo, jak się opróżniane dzięki regularnym meczu ekspresji.

Ze strony podręcznika xargs:

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

Znajdź pliki o nazwie core w katalogu / tmp lub poniżej i usuń je, ale wydajniej niż w poprzednim przykładzie (ponieważ unikamy konieczności używania fork (2) i exec (2) do uruchomienia rm i nie potrzebujemy dodatkowy proces xargs).

Aaron Hall
źródło
Prawdopodobnie mógłbyś przenieść wersję Pythona do jednej linii, używając shutil.rmteena __pycache__katalogach zamiast najpierw je opróżniać; jednolinijkowy może być dobry dla łatwego aliasu. Jestem teraz wielkim fanem Path, więc myślę, że użyję tej wersji w moim skrypcie.
Nathan,
25

Ponieważ jest to projekt Python 3, wystarczy usunąć __pycache__katalogi - wszystkie pliki .pyc/ .pyoznajdują się w nich.

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

lub jego prostsza forma,

find . -type d -name __pycache__ -delete

co z jakiegoś powodu nie zadziałało (pliki zostały usunięte, ale katalogi nie), więc ze względu na kompletność dołączam oba.


Alternatywnie, jeśli robisz to w katalogu, który jest pod kontrolą wersji, możesz nakazać RCS __pycache__rekurencyjne ignorowanie folderów. Następnie w odpowiednim momencie po prostu wyczyść wszystkie zignorowane pliki. Prawdopodobnie będzie to wygodniejsze, ponieważ prawdopodobnie będzie trzeba posprzątać więcej niż tylko __pycache__.

ivan_pozdeev
źródło
Nie, nie wszystkie .pycpliki się w nim znajdują.
Martin Thoma,
@ V.Gamula Jest to znacznie bezpieczniejsza komenda niż ta, którą ~ 114 osób miało szczęście, że nie ugryzło ich trwałym usunięciem błędnego dopasowania.
dlamblin
@MartinThoma w projekcie tylko dla Pythona3?
dlamblin
4
Czy tylko ja mam Directory not emptytutaj drugi wariant?
matanster
13

To jest mój alias, który działa zarówno z Pythonem 2, jak i Pythonem 3, usuwając rekursywnie wszystkie .pyc .pyopliki i __pycache__katalogi.

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
Carlos Bazaga
źródło
Wielkie dzięki. Pomogło mi to pozbyć się wszystkich niepotrzebnych plików do moich repozytoriów.
Harsh Aggarwal
13

Jeśli potrzebujesz trwałego rozwiązania do utrzymywania plików pamięci podręcznej Pythona z dala od katalogów projektu:

Począwszy od Pythona 3.8 możesz użyć zmiennej środowiskowej PYTHONPYCACHEPREFIXdo zdefiniowania katalogu pamięci podręcznej dla Pythona.

Z dokumentacji Pythona:

Jeśli ta opcja jest ustawiona, Python zapisze pliki .pyc w lustrzanym drzewie katalogów w tej ścieżce, zamiast w katalogach pycache w drzewie źródłowym. Jest to równoważne określeniu opcji -X pycache_prefix = PATH.

Przykład

Jeśli dodasz następujący wiersz do swojego ./profilew systemie Linux:

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

Python nie utworzy irytujących __pycache__katalogów w katalogu twojego projektu, zamiast tego umieści je wszystkie pod~/.cache/cpython/

Rotareti
źródło
4
Dzięki Bogu to nadchodzi. Katalog kuwet pycache był błędem.
Sarah G,
7

Polecenie, którego użyłem:

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

Wyjaśnia:

  1. Najpierw znajduje wszystkie __pycache__foldery w bieżącym katalogu.

  2. Wykonaj, rm -r {} +aby usunąć każdy folder w powyższym kroku ( {} oznacza symbol zastępczy i +zakończenie polecenia)

Edytowano 1:

Używam Linuksa, aby ponownie użyć polecenia, które dodałem poniższy wiersz do ~/.bashrcpliku

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

Edytowano 2: jeśli używasz VS Code , nie musisz usuwać __pycache__ręcznie. Możesz dodać poniższy fragment do settings.jsonpliku. Następnie VS Code ukryje wszystkie __pycache__foldery

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

Mam nadzieję, że to pomoże !!!

leminhnguyenHUST
źródło
4

Korzystanie z PyCharm

Aby usunąć pliki skompilowane w Pythonie

  1. W oknie Project Tool Windowkliknij prawym przyciskiem myszy projekt lub katalog, z którego mają zostać usunięte skompilowane pliki Pythona.

  2. Z menu kontekstowego wybierz Clean Python compiled files.

Te .pycpliki znajdujące się na wybranym katalogu są dyskretnie usunięty.

AB Abhi
źródło
4

Z katalogu projektu wpisz:

Usuwanie wszystkich plików .pyc

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

Usuwanie wszystkich plików .pyo :

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

Na koniec, aby usunąć wszystkie „__pycache__” , wpisz:

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

Jeśli napotkasz błąd odmowy uprawnień , dodaj sudo na początku wszystkich powyższych poleceń.

thierno
źródło
2

Bardzo dziękuję za inne odpowiedzi, na ich podstawie użyłem tego do prermpliku mojego pakietu Debiana :

#!/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
Craig
źródło
0

Dlaczego po prostu nie użyć rm -rf __pycache__? Uruchom git add -Apóźniej, aby usunąć je z repozytorium i dodać __pycache__/do pliku .gitignore.

Bachsau
źródło
1
Nie robi tego ręcznie. Próbuje dodać go do skryptu używanego w pakiecie Debiana. Pakiet Debiana nie jest używany z git, ale z menedżerem pakietów Debiana lub instalatorem apt.
Craig,
-13

Po prostu przejdź do terminala i wpisz:

$rm __pycache__

i zostanie usunięty.

Avi Gabrielle Pansensoy
źródło