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

Sal*_*een 133 python delete-file python-3.x python-3.4

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

V. *_*ula 210

您可以使用下一个命令手动执行此操作:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

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

  • 命令很脏.它还将删除`*__ pycache__`,`*.pyc*`,它不区分文件和目录.大多数生成的`rm`命令也是多余的. (7认同)
  • 该命令不安全。确保您要在此处执行的操作,如果您位于 python 虚拟环境中,并且执行此命令,它也会删除虚拟环境中的整个 .pyc。 (6认同)
  • 这是错的.这不是你如何使用`find`或`grep`或`rm`,它可能是危险的任何当前工作目录可能包含`useful.pycle.json`或`important_deployment_setting_about__pycache __.txt`等.我不会这样做在SO的整个用户群中.更不用说(危险的`rm -rf`)如何破坏`xargs`将是一个名称中带有空格的文件.所以我编辑了...... (5认同)
  • 不适用于 OSX `grep: 括号不平衡` (2认同)

Sal*_*een 76

当我把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
Run Code Online (Sandbox Code Playgroud)

跑步py3clean .很干净.

  • 它不会删除`__pycache__`文件夹,也不会删除`.pyc`文件(在debian上测试) (7认同)
  • py3clean比@ V.Gamula的命令更保守:它不会删除从之后删除的源文件生成的.pyc文件. (5认同)
  • python3-minimal似乎仅在Debian上可用(在RHEL,CentOS,brew,MacOS上找不到) (2认同)

Aar*_*all 61

macOS和Linux

BSD find在macOS上的实现与GNU find不同 - 这与BSD和GNU find都兼容.从一个globbing实现开始,使用-name-ofor - 将此函数放入您的.bashrc文件中:

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

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

GNU find-only

这是一个GNU查找,只有(即Linux)解决方案,但我觉得正则表达式更好一点:

pyclean () {
    find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Run Code Online (Sandbox Code Playgroud)

任何平台,使用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__')]"
Run Code Online (Sandbox Code Playgroud)

这会滥用列表对循环的理解,但在使用时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()"
Run Code Online (Sandbox Code Playgroud)

批评答案

最常见的答案是:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

这似乎效率较低,因为它使用三个进程.find采用正则表达式,因此我们不需要单独调用grep.同样的,它有-delete,所以我们并不需要单独调用rm-和违背评论在这里,它这么长时间删除非空目录,因为他们得到凭借正则表达式匹配的清空.

xargs手册页:

find /tmp -depth -name core -type f -delete
Run Code Online (Sandbox Code Playgroud)

在目录/ tmp中或下面找到名为core的文件并删除它们,但比前一个示例更有效(因为我们避免使用fork(2)和exec(2)来启动rm而我们不需要额外的xargs过程).

  • ```python -Bc "导入pathlib;导入shutil; [shutil.rmtree(p) for p in pathlib.Path('.').rglob('__pycache__')]" ``` (2认同)

小智 26

我在 Mac 上运行 Python3 和 pip3。对我来说,解决方案如下(在我的项目的根目录中):

pip3 install pyclean
pyclean .
Run Code Online (Sandbox Code Playgroud)

我想强调的是,因为我看到许多涉及 bash 脚本的答案,所以软件中的最佳实践是支持经过测试的问题解决方案(这正是已建立的 python 包所代表的内容)而不是手动方法。


Rot*_*eti 24

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

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

来自 Python 文档:

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

例子

如果您./profile在 Linux 中添加以下行:

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Run Code Online (Sandbox Code Playgroud)

Python 不会__pycache__在您的项目目录中创建烦人的目录,而是会将它们全部放在~/.cache/cpython/

  • 谢天谢地,这一切即将到来。__pycache__ 垃圾目录是一个错误。 (9认同)
  • @Keelung:我不确定是否建议使用系统范围的文件夹,例如“/var/cache”:这可能会与系统上其他用户的缓存发生冲突 - 特别是在“分发级别”上配置它时(即将该设置设置为所有用户的默认设置)。 (3认同)

iva*_*eev 21

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

find . -type d -name __pycache__ -exec rm -r {} \+
Run Code Online (Sandbox Code Playgroud)

或者更简单的形式,

find . -type d -name __pycache__ -delete
Run Code Online (Sandbox Code Playgroud)

由于某种原因这对我不起作用(文件被删除但目录不是),所以为了完整起见我包括两者.


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

  • 我是唯一一个在第二个变体中得到“目录不为空”的人吗? (8认同)

lem*_*yen 21

我用过的命令:

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 {} +'
Run Code Online (Sandbox Code Playgroud)

编辑 2: 如果您使用VS Code,则无需__pycache__手动删除。您可以将下面的代码段添加到settings.json文件中。之后,VS Code__pycache__为你隐藏所有文件夹

"files.exclude": {
     "**/__pycache__": true
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 !!!


Goo*_*Pen 13

有一个不错的 pip 包。

pip install pyclean
pyclean --verbose .
Run Code Online (Sandbox Code Playgroud)

完毕


AB *_*bhi 7

使用 PyCharm

删除 Python 编译文件

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

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

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


小智 7

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

删除所有.pyc文件

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

删除所有.pyo文件:

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

最后,要删除所有'__pycache__',请键入:

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

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


小智 5

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

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
Run Code Online (Sandbox Code Playgroud)