问题
What is the BEST way to clear out all the __pycache__
folders and .pyc/.pyo
files from a python3 project. I have seen multiple users suggest the pyclean
script bundled with Debian, but this does not remove the folders. I want a simple way to clean up the project before pushing the files to my DVS.
回答1:
You can do it manually with the next command:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
This will remove all *.pyc files and __pycache__ directories recursively in the current directory.
回答2:
I found the answer myself when I mistyped pyclean as 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
Running py3clean .
cleaned it up very nicely.
回答3:
macOS & Linux
BSD's find
implementation on macOS is different from GNU find - this is compatible with both BSD and GNU find. Start with a globbing implementation, using -name
and the -o
for or - Put this function in your .bashrc
file:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Then cd
to the directory you want to recursively clean, and type pyclean
.
GNU find-only
This is a GNU find, only (i.e. Linux) solution, but I feel it's a little nicer with the regex:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Any platform, using Python 3
On Windows, you probably don't even have find
. You do, however, probably have Python 3, which starting in 3.4 has the convenient pathlib
module:
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__')]"
This abuses list comprehensions for looping, but when using python -c
, style is rather a secondary concern. Alternatively we could abuse (for example) __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()"
Critique of an answer
The top answer used to say:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
This would seem to be less efficient because it uses three processes. find
takes a regular expression, so we don't need a separate invocation of grep
. Similarly, it has -delete
, so we don't need a separate invocation of rm
—and contrary to a comment here, it will delete non-empty directories so long as they get emptied by virtue of the regular expression match.
From the xargs
man page:
find /tmp -depth -name core -type f -delete
Find files named core in or below the directory /tmp and delete them, but more efficiently than in the previous example (because we avoid the need to use fork(2) and exec(2) to launch rm and we don't need the extra xargs process).
回答4:
Since this is a Python 3 project, you only need to delete __pycache__
directories -- all .pyc
/.pyo
files are inside them.
find . -type d -name __pycache__ -exec rm -r {} \+
or its simpler form,
find . -type d -name __pycache__ -delete
which didn't work for me for some reason (files were deleted but directories weren't), so I'm including both for the sake of completeness.
Alternatively, if you're doing this in a directory that's under revision control, you can tell the RCS to ignore __pycache__
folders recursively. Then, at the required moment, just clean up all the ignored files. This will likely be more convenient because there'll probably be more to clean up than just __pycache__
.
回答5:
This is my alias that works both with Python 2 and Python 3 removing all .pyc .pyo
files as well __pycache__
directories recursively.
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
回答6:
If you need a permanent solution for keeping Python cache files out of your project directories:
Starting with Python 3.8 you can use the environment variable PYTHONPYCACHEPREFIX
to define a cache directory for Python.
From the Python docs:
If this is set, Python will write .pyc files in a mirror directory tree at this path, instead of in pycache directories within the source tree. This is equivalent to specifying the -X pycache_prefix=PATH option.
Example
If you add the following line to your ./profile
in Linux:
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Python won't create the annoying __pycache__
directories in your project directory, instead it will put all of them under ~/.cache/cpython/
回答7:
Thanks a lot for the other answers, based on them this is what I used for my Debian package's prerm
file:
#!/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
回答8:
Using PyCharm
To remove Python compiled files
In the
Project Tool Window
, right-click a project or directory, where Python compiled files should be deleted from.On the context menu, choose
Clean Python compiled files
.
The .pyc
files residing in the selected directory are silently deleted.
回答9:
Why not just use rm -rf __pycache__
? Run git add -A
afterwards to remove them from your repository and add __pycache__/
to your .gitignore file.
回答10:
From the project directory type the following:
Deleting all .pyc files
find . -path "*/*.pyc" -delete
Deleting all .pyo files:
find . -path "*/*.pyo" -delete
Finally, to delete all '__pycache__', type:
find . -path "*/__pycache__" -type d -exec rm -r {} ';'
If you encounter permission denied error, add sudo at the begining of all the above command.
回答11:
Please just go to your terminal then type:
$rm __pycache__
and it will be removed.
来源:https://stackoverflow.com/questions/28991015/python3-project-remove-pycache-folders-and-pyc-files