Каков наилучший способ удалить все папки __pycache__
и .pyc/.pyo
из проекта python3. Я видел, что несколько пользователей предлагают pyclean
script в комплекте с Debian, но это не удаляет папки. Я хочу простой способ очистить проект, прежде чем нажимать файлы на свой DVS.
Проект Python3 удаляет папки __pycache__ и .pyc
Ответ 1
Я сам нашел ответ, когда я ошибся 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 .
очень хорошо очистил его.
Ответ 2
Вы можете сделать это вручную с помощью следующей команды:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Это приведет к удалению всех файлов *.pyc и __ pycache __ каталогов в текущем каталоге.
Ответ 3
macOS и Linux
Реализация BSD find
в macOS отличается от GNU find - это совместимо как с BSD, так и с GNU find. Начните с реализации -name
, используя -name
и -o
для или - Поместите эту функцию в ваш файл .bashrc
:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Затем cd
в каталог, который вы хотите рекурсивно очистить, и введите pyclean
.
GNU найти -o только
Это решение GNU find, only (то есть Linux), но мне кажется, что с регулярным выражением оно выглядит немного лучше:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Любая платформа, использующая Python 3
В Windows вы, вероятно, даже не find
. Однако у вас, вероятно, есть Python 3, который, начиная с 3.4, имеет удобный модуль pathlib
:
python3 -c "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -c "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
Это нарушает понимание списка для зацикливания, но при использовании python -c
стиль является второстепенной задачей. В качестве альтернативы мы можем злоупотреблять (например) __import__
:
python3 -c "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -c "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).
Ответ 4
Поскольку это проект Python 3, вам нужно только удалить __pycache__
- все файлы .pyc
/.pyo
находятся внутри них.
find . -type d -name __pycache__ -exec rm -r {} \+
или его более простая форма,
find . -type d -name __pycache__ -delete
который по какой-то причине мне не помог (файлы были удалены, но каталоги не были), поэтому я включаю оба для полноты картины.
В качестве альтернативы, если вы делаете это в каталоге, который находится под управлением редакции, вы можете указать RCS рекурсивно игнорировать папки __pycache__
. Затем, в нужный момент, просто очистите все игнорируемые файлы. Это, вероятно, будет более удобным, потому что, вероятно, будет больше, чем просто __pycache__
.
Ответ 5
Это мой псевдоним, который работает как с Python 2, так и с Python 3, рекурсивно удаляя все файлы .pyc.pyo
а также __pycache__
.
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
Ответ 6
Большое спасибо за другие ответы, основанные на них, это то, что я использовал для моего файла 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
Ответ 7
Если вам нужно постоянное решение для хранения файлов кэша 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/
Ответ 8
Использование PyCharm
Чтобы удалить Python скомпилированные файлы
-
В окне
Project Tool Window
щелкните правой кнопкой мыши проект или каталог, из которого следует удалить скомпилированные файлы Python. -
В контекстном меню выберите "
Clean Python compiled files
.
Файлы .pyc
находящиеся в выбранном каталоге, автоматически удаляются.
Ответ 9
Почему бы просто не использовать rm -rf __pycache__
? git add -A
запустите git add -A
чтобы удалить их из своего хранилища, и добавьте __pycache__/
в свой файл .gitignore.
Ответ 10
Просто зайдите в свой терминал и введите:
$rm __pycache__
и он будет удален.