Проект 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 Я думаю, вы говорите о другом ответе; или история изменений 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 .вычистил это очень хорошо.


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__.


Нет, не все .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/


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
}

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


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.