Проект Python3 видаляє папки __pycache__ та файли .pyc


166

Який найкращий спосіб очистити всі __pycache__ папки та .pyc/.pyoфайли з проекту python3. Я бачив, як багато користувачів пропонують pycleanсценарій у комплекті з Debian, але це не видаляє папки. Я хочу простий спосіб очистити проект, перш ніж натискати файли на мій DVS.

Відповіді:


241

Ви можете зробити це вручну за допомогою наступної команди:

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

Це видалить усі файли * .pyc та каталоги __pycache__ рекурсивно в поточному каталозі.


8
Команда брудна. Він також буде видалений *__pycache__, *.pyc*і він не розрізняє файли та каталоги. Більшість створених rmкоманд також буде зайвою.
ivan_pozdeev

12
Це просто неправильно. Це не те, як ви використовуєте, findні grepні, rmі це може бути небезпечно для будь-якого поточного робочого каталогу, який може містити useful.pycle.jsonабо important_deployment_setting_about__pycache__.txtінше, що я не виключав би на всій базі користувачів SO. Не кажучи вже про те, як (небезпечно rm -rf) бився xargsфайл з пробілом у назві. Тож я її відредагував…
dlamblin

@dwanderson Я думаю, ти говориш про іншу відповідь; чи історія редагування ТАК більше не показує всю історію EG. У 2017 році з'явилася версія, яка не відображається?
dlamblin

2
Не працює на OSXgrep: parentheses not balanced
Daniel W.

85

Я знайшов відповідь, коли я неправильно ввів пиклеана як пісклея:

    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 .очистив це дуже красиво.


6
py3clean більш консервативний, ніж команда @ V.Gamula: він не видаляє .pyc файли, згенеровані з вихідних файлів, які були видалені з тих пір.
Jérôme

1
Станом на травень 2017 року в macos / homebrew мені довелося використовувати пакет pycleaner від pip, а команда для його виконання - це pycleaner. Тільки Python 2.
Вілліан Міцуда

3
Здається, python3-minimal доступний лише для Debian (не знайти його в RHEL, CentOS, brew, MacOS)
user12345

1
як не дивно, мій встановлений py3clean (3.5.1-3) насправді нічого не робить, очищає жоден із цих файлів і просто мовчки повертається (python 3.6.5).
matanster

4
Він не видаляє __pycache__ні папок, ні .pycфайлів (тестованих на debian)
EricLavault

82

macOS та Linux

findРеалізація BSD на macOS відрізняється від пошуку GNU - це сумісно як з BSD, так і з GNU. Почніть з глобальної реалізації, використовуючи -nameта -oдля або - Покладіть цю функцію у свій .bashrcфайл:

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

Потім cdв каталог, який потрібно рекурсивно очистити, і введіть pyclean.

GNU - лише знахідка

Це єдине (тобто Linux) рішення GNU, але я вважаю, що це трохи приємніше з регулярним виразом:

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

Будь-яка платформа, використовуючи Python 3

У Windows, напевно, навіть немає find. Однак у вас, мабуть, є Python 3, який починаючи з 3.4 має зручний pathlibмодуль:

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

Це здається менш ефективним, оскільки використовує три процеси. findприймає регулярний вираз, тому нам не потрібен окремий виклик grep. Так само є -delete, тому нам не потрібен окремий виклик - rmі всупереч коментарю тут, він буде видаляти непорожні каталоги до тих пір, поки вони будуть випорожнені внаслідок регулярного збігу виразів.

Із xargsчоловічої сторінки:

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

Знайдіть файли з ім’ям ядра в каталозі / tmp або нижче та видаліть їх, але ефективніше, ніж у попередньому прикладі (адже ми уникаємо необхідності використовувати fork (2) та exec (2) для запуску rm, і нам не потрібен додатковий процес xargs).


Ви могли б отримати версію пітона на один рядок, використовуючи shutil.rmteeна __pycache__каталоги , а не спорожняти їх першим; один-лайнер може бути приємним для легкого псевдоніма. PathЗараз я великий шанувальник , тому я думаю, що використаю цю версію в своєму сценарії.
Натан

25

Оскільки це проект Python 3, вам потрібно лише видалити __pycache__каталоги - всі .pyc/ .pyoфайли знаходяться всередині них.

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

або його більш просту форму,

find . -type d -name __pycache__ -delete

яка чомусь не працювала для мене (файли видалено, але каталоги не були), тому я включаю обидва заради повноти.


Крім того, якщо ви робите це в каталозі, який знаходиться під контролем редагування, ви можете сказати RCS ігнорувати __pycache__папки рекурсивно. Потім в потрібний момент просто очистіть усі проігноровані файли. Це, ймовірно, буде зручніше, тому що прибирати, ймовірно, буде більше, ніж просто __pycache__.


Ні, не всі .pycфайли знаходяться всередині нього.
Мартін Тома

@ V.Gamula Це набагато більш безпечна команда, ніж одна ~ 114 людей пощастило, не покусавши їх постійним видаленням помилкового поєдинку.
dlamblin

@MartinThoma в проекті python3?
dlamblin

4
Я єдиний, хто отримує Directory not emptyтут другий варіант?
matanster

13

Це мій псевдонім, який працює як з Python 2, так і з Python 3, видаляючи всі .pyc .pyoфайли, а також __pycache__каталоги рекурсивно.

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

Дуже дякую. Це допомогло мені позбутися всіх непотрібних файлів для мого репосту.
Різкий

13

Якщо вам потрібно постійне рішення для збереження файлів кеша Python з каталогів вашого проекту:

Починаючи з Python 3.8, ви можете використовувати змінну середовища PYTHONPYCACHEPREFIXдля визначення каталогу кешу для Python.

З документів Python:

Якщо це встановлено, Python записуватиме файли .pyc у дерево дзеркальних каталогів на цьому шляху, а не в каталоги pycache у вихідному дереві. Це еквівалентно визначенню параметра -X pycache_prefix = PATH.

Приклад

Якщо ви додасте наступний рядок до свого ./profileв Linux:

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

Python не створить дратівливих __pycache__каталогів у вашому каталозі проектів, натомість він поставить їх усі~/.cache/cpython/


4
Слава Богу, що це приходить. У pycache каталоги підстилка були промахом.
Сара Г

7

Команда, яку я використав:

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

Пояснює:

  1. Спочатку знаходить усі __pycache__папки в поточному каталозі.

  2. Виконайте, rm -r {} +щоб видалити кожну папку на кроці вище ( {} підпишіть для заповнювача та +закінчення команди)

Відредаговано 1:

Я використовую Linux, щоб повторно використовувати команду, яку я додав у ~/.bashrcфайл рядок нижче

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

Змінено 2: Якщо ви використовуєте код VS , видаляти його __pycache__вручну не потрібно . Ви можете додати фрагмент нижче до settings.jsonфайлу. Після цього код VS приховає всі __pycache__папки для вас

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

Сподіваюся, це допомагає !!!


4

Використання PyCharm

Щоб видалити файли, складені Python

  1. В Project Tool Windowправою кнопкою миші проект або каталог, де Python скомпільовані файли повинні бути видалені з.

  2. У контекстному меню виберіть Clean Python compiled files.

Ці .pycфайли , що знаходяться в вибраній директорії мовчки видаляється.


4

З каталогу каталогу введіть наступне:

Видалення всіх .pyc файлів

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

Видалення всіх файлів .pyo :

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

Нарешті, щоб видалити всі '__pycache__' , введіть:

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

Якщо ви зіткнулися з дозволом, у якому відхилена помилка, додайте sudo на початку всієї вищевказаної команди.


2

Велике спасибі за інші відповіді, на їх основі - це те, що я використовував у prermфайлі пакету Debian :

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

Чому б просто не використовувати rm -rf __pycache__? git add -AПісля цього запустіть їх, щоб вилучити їх із сховища та додати __pycache__/до файлу .gitignore.


1
Він не робить цього вручну. Він намагається додати його до сценарію, який використовується в пакеті Debian. Пакет debian використовується не з git, а з диспетчером пакунків debian або встановником apt.
Крейг

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.