python3 프로젝트에서 모든 __pycache__ 폴더와 .pyc/.pyo파일 을 지우는 가장 좋은 방법은 무엇입니까? 여러 사용자 pyclean가 데비안과 함께 제공되는 스크립트를 제안 했지만 폴더를 제거하지는 않습니다. 파일을 DVS로 푸시하기 전에 프로젝트를 정리하는 간단한 방법을 원합니다.
python3 프로젝트에서 모든 __pycache__ 폴더와 .pyc/.pyo파일 을 지우는 가장 좋은 방법은 무엇입니까? 여러 사용자 pyclean가 데비안과 함께 제공되는 스크립트를 제안 했지만 폴더를 제거하지는 않습니다. 파일을 DVS로 푸시하기 전에 프로젝트를 정리하는 간단한 방법을 원합니다.
답변:
다음 명령으로 수동으로 수행 할 수 있습니다.
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
현재 디렉토리에서 모든 * .pyc 파일과 __pycache__ 디렉토리를 재귀 적으로 제거합니다 .
find아니며 grep또한 rm현재 작업 디렉토리에 포함되어 useful.pycle.json있거나 important_deployment_setting_about__pycache__.txt등 이있을 수있는 위험 할 수 있습니다 .SO 의 전체 사용자 기반에서 제외하지 않을 것입니다. 이름에 공백이있는 파일에 의해 (위험하게 rm -rf) 깨진 xargs것은 말할 것도 없습니다 . 그래서 편집했습니다…
grep: parentheses not balanced
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 .것이 아주 멋지게 정리되었습니다.
__pycache__폴더 나 .pyc파일을 삭제하지 않습니다 (debian에서 테스트)
findmacOS 에서의 BSD 구현은 GNU find와 다릅니다. 이것은 BSD 및 GNU find와 모두 호환됩니다. -name및 -ofor 또는 - 를 사용하여 globbing 구현으로 시작하십시오. 이 함수를 .bashrc파일 에 넣으십시오 .
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
그런 다음 cd재귀 적으로 정리하려는 디렉토리로 이동하여 다음 을 입력하십시오.pyclean .
이것은 GNU 찾기, 유일한 (예 : Linux) 솔루션이지만 정규 표현식으로 조금 더 좋다고 생각합니다.
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Windows의 경우조차 없을 것 find입니다. 그러나 3.4에서 시작하는 편리한 pathlib모듈 이있는 Python 3이있을 수 있습니다 .
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플래그는 작성하지 파이썬을 알려줍니다 .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 디렉토리에서 또는 아래에서 core라는 파일을 찾아 삭제하지만 이전 예제보다 효율적입니다 (fork (2) 및 exec (2)를 사용하여 rm을 시작할 필요가 없기 때문에 추가 xargs 프로세스).
shutil.rmtee온 __pycache__대신 먼저 비우는의 디렉토리; 하나의 라이너는 쉬운 별칭을 위해 좋습니다. 하지만 지금은 열렬한 팬 Path이므로 스크립트에서 해당 버전을 사용한다고 생각합니다.
이것은 Python 3 프로젝트이므로 __pycache__디렉토리 만 삭제하면됩니다 . 모든 .pyc/ .pyo파일은 그 안에 있습니다.
find . -type d -name __pycache__ -exec rm -r {} \+
또는 더 간단한 형태,
find . -type d -name __pycache__ -delete
어떤 이유로 든 효과가 없었습니다 (파일은 삭제되었지만 디렉토리는 그렇지 않았습니다). 그래서 나는 완전성을 위해 둘 다 포함시킵니다.
또는 개정 제어중인 디렉토리에서이 작업을 수행하는 경우 RCS에게 __pycache__폴더를 재귀 적 으로 무시하도록 지시 할 수 있습니다 . 그런 다음 필요한 순간에 무시 된 모든 파일을 정리하십시오. 아마도 단순한 것보다 정리하는 것이 더 많기 때문에 더 편리 할 것입니다 __pycache__.
.pyc파일이 그 안에있는 것은 아닙니다.
Directory not empty두 번째 변형을 얻는 유일한 사람 입니까?
이것은 파이썬 2 및 파이썬 3과 함께 작동하여 모든 .pyc .pyo파일과 __pycache__디렉토리를 재귀 적 으로 제거하는 별칭입니다 .
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
Python 캐시 파일을 프로젝트 디렉토리에서 유지하기위한 영구적 인 솔루션 이 필요한 경우 :
Python 3.8 부터는 환경 변수 PYTHONPYCACHEPREFIX를 사용하여 Python의 캐시 디렉토리를 정의 할 수 있습니다 .
파이썬 문서에서 :
이것이 설정되면, 파이썬은 소스 트리 내의 pycache 디렉토리 대신이 경로의 미러 디렉토리 트리에 .pyc 파일을 작성합니다 . 이것은 -X pycache_prefix = PATH 옵션을 지정하는 것과 같습니다.
예
./profileLinux에서 다음 줄을 추가하면 :
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
파이썬은 __pycache__프로젝트 디렉토리에 성가신 디렉토리를 만들지 않고 대신 모든 디렉토리를 배치합니다~/.cache/cpython/
내가 사용한 명령 :
find . -type d -name "__pycache__" -exec rm -r {} +
설명합니다 :
먼저 __pycache__현재 디렉토리에서 모든 폴더를 찾습니다 .
rm -r {} +위의 단계에서 각 폴더를 삭제하려면 실행하십시오 ( {} 자리 표시자를 +나타내고 명령을 종료하십시오)
편집 1 :
나는 리눅스를 사용하고 있는데, 명령을 재사용하기 위해 아래 줄을 ~/.bashrc파일에 추가했다.
alias rm-pycache='find . -type d -name "__pycache__" -exec rm -r {} +'
편집 2 : VS Code를
사용하는 경우 __pycache__수동으로 제거 할 필요가 없습니다 . 아래의 스 니펫을 settings.json파일에 추가 할 수 있습니다 . 그 후 VS 코드 는 모든 __pycache__폴더를 숨 깁니다.
"files.exclude": {
"**/__pycache__": true
}
희망이 있습니다 !!!
다른 답변에 감사드립니다.이를 기반으로 데비안 패키지 prerm파일에 사용한 것입니다.
#!/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
터미널로 가서 다음을 입력하십시오.
$rm __pycache__
제거됩니다.
*__pycache__,*.pyc*그것은 파일과 디렉토리를 구분하지 않습니다. 생성 된rm명령의 대부분 도 불필요합니다.