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

166

Какой самый лучший способ очистить все __pycache__ папки и .pyc/.pyoфайлы из проекта Python3. Я видел, как несколько пользователей предлагали pycleanсценарий в комплекте с Debian, но это не удаляет папки. Я хочу простой способ очистить проект перед загрузкой файлов на DVS.

SalientGreen
источник

Ответы:

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 Я думаю, вы говорите о другом ответе; или история изменений SO больше не отображает полную историю. Например, в 2017 году была версия, которая там не показана?
Дламблин
2
Не работает на OSXgrep: parentheses not balanced
Даниэль В.
85

Я нашел ответ сам, когда набрал 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 .вычистил это очень хорошо.

SalientGreen
источник
6
py3clean более консервативен, чем команда @ V.Gamula: он не удаляет файлы .pyc, созданные из исходных файлов, которые были удалены с тех пор.
Жером
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 find - это совместимо как с BSD, так и с GNU find. Начните с полной реализации, используя -nameи -oдля или - Поместите эту функцию в ваш .bashrcфайл:

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

Затем cdв каталог, который вы хотите рекурсивно очистить, и введите pyclean.

GNU только для поиска

Это решение GNU find, only (то есть Linux), но я чувствую, что с регулярным выражением это немного лучше:

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

Найдите файлы с именем core в каталоге / 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__.

ivan_pozdeev
источник
Нет, не все .pycфайлы находятся внутри.
Мартин Тома
@ V.Gamula Это значительно более безопасная команда, чем та, которой ~ 114 человек посчастливилось не укусить их с помощью постоянного удаления ошибочного совпадения.
Дламблин
@MartinThoma в проекте только на python3?
Дламблин
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/

Rotareti
источник
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 Code , вам не нужно удалять __pycache__вручную. Вы можете добавить фрагмент ниже в settings.jsonфайл. После этого VS Code скроет все __pycache__папки для вас

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

Надеюсь, поможет !!!

leminhnguyenHUST
источник
4

Использование PyCharm

Чтобы удалить Python скомпилированные файлы

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

  2. В контекстном меню выберите Clean Python compiled files.

Эти .pycфайлы , находящиеся в выбранной директории молча удаляется.

AB Abhi
источник
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
Craig
источник
0

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

Bachsau
источник
1
Он не делает это вручную. Он пытается добавить его в скрипт, используемый в пакете Debian. Пакет debian используется не с git, а с менеджером пакетов debian или установщиком apt.
Крейг
-13

Пожалуйста, просто зайдите в свой терминал и введите:

$rm __pycache__

и это будет удалено.

Ави Габриэль Пансенсой
источник