Python3项目删除__pycache__文件夹和.pyc文件

问题:Python3项目删除__pycache__文件夹和.pyc文件

从python3项目中清除所有__pycache__ 文件夹和.pyc/.pyo文件的最佳方法是什么?我已经看到多个用户建议pyclean与Debian捆绑在一起的脚本,但这不会删除文件夹。我想要一种简单的方法来将项目推送到我的DVS之前清理项目。

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.


回答 0

您可以使用下一条命令手动进行操作:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

这将递归地删除当前目录中的所有* .pyc文件和__pycache__目录。

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.


回答 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 .清理它很好。

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.


回答 2

macOS和Linux

BSD find在macOS上的实现不同于GNU find-这与BSD和GNU find兼容。使用-name和的-ofor -将这个函数放入.bashrc文件中,从全局实现开始。

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

然后cd到您要递归清理的目录,然后键入pyclean

GNU仅查找

这是GNU唯一的解决方案(即Linux)解决方案,但是我觉得使用regex会更好一些:

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

在/ tmp目录下或目录下查找名为core的文件并将其删除,但是比上一个示例更有效(因为我们避免了需要使用fork(2)和exec(2)来启动rm,并且不需要额外的xargs流程)。

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 -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__')]"

The -B flag tells Python not to write .pyc files. (See also the PYTHONDONTWRITEBYTECODE environment variable.)

The above abuses list comprehensions for looping, but when using python -c, style is rather a secondary concern. Alternatively we could abuse (for example) __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()"

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


回答 3

由于这是一个Python 3项目,因此您只需要删除__pycache__目录-所有.pyc/ .pyo文件都在其中。

find . -type d -name __pycache__ -exec rm -r {} \+

或更简单的形式

find . -type d -name __pycache__ -delete

出于某种原因对我不起作用(文件已删除,但目录未删除),因此出于完整性考虑,我将两者都包括在内。


另外,如果在受版本控制的目录中执行此操作,则可以告诉RCS __pycache__递归忽略文件夹。然后,在需要的时刻,只需清理所有被忽略的文件。这可能会更方便,因为可能需要清理的不仅仅是余地__pycache__

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


回答 4

这是我的别名,可与Python 2和Python 3一起使用,.pyc .pyo__pycache__递归方式删除所有文件以及目录。

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'

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 {} +'

回答 5

如果需要永久解决方案以将Python缓存文件保留在项目目录之外:

Python 3.8开始,您可以使用环境变量PYTHONPYCACHEPREFIX为Python定义一个缓存目录。

从Python文档中:

如果设置了该选项,Python将在此路径的镜像目录树中而不是源树中的pycache目录中写入.pyc文件。这等效于指定-X pycache_prefix = PATH选项。

如果./profile将以下行添加到Linux中:

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

Python不会__pycache__在您的项目目录中创建烦人的目录,而是将所有这些目录放在~/.cache/cpython/

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/


回答 6

我使用的命令:

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
}

希望能帮助到你 !!!

The command I’ve used:

find . -type d -name "__pycache__" -exec rm -r {} +

Explains:

  1. First finds all __pycache__ folders in current directory.

  2. Execute rm -r {} + to delete each folder at step above ({} signify for placeholder and + to end the command)

Edited 1:

I’m using Linux, to reuse the command I’ve added the line below to the ~/.bashrc file

alias rm-pycache='find . -type d -name  "__pycache__" -exec rm -r {} +'

Edited 2: If you’re using VS Code, you don’t need to remove __pycache__ manually. You can add the snippet below to settings.json file. After that, VS Code will hide all __pycache__ folders for you

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

Hope it helps !!!


回答 7

从项目目录中键入以下内容:

删除所有.pyc文件

find . -path "*/*.pyc" -delete

删除所有.pyo文件:

find . -path "*/*.pyo" -delete

最后,要删除所有‘__pycache__’,请输入:

find . -path "*/__pycache__" -type d -exec rm -r {} ';'

如果遇到权限拒绝错误,请在上述所有命令的开头添加sudo

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.


回答 8

使用PyCharm

删除Python编译文件

  1. 在中Project Tool Window,右键单击应从中删除Python编译文件的项目或目录。

  2. 在上下文菜单上,选择Clean Python compiled files

.pyc驻留在所选目录中的文件将被静默删除。

Using PyCharm

To remove Python compiled files

  1. In the Project Tool Window, right-click a project or directory, where Python compiled files should be deleted from.

  2. On the context menu, choose Clean Python compiled files.

The .pyc files residing in the selected directory are silently deleted.


回答 9

非常感谢其他答案,基于这些答案,这就是我用于Debian软件包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

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

回答 10

为什么不只是使用rm -rf __pycache__git add -A然后运行以将其从存储库中删除,然后添加__pycache__/到您的.gitignore文件中。

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.


回答 11

请直接到您的终端,然后输入:

$rm __pycache__

它将被删除。

Please just go to your terminal then type:

$rm __pycache__

and it will be removed.