![](/img/trans.png)
[英]Python3 __pycache__ generating even if PYTHONDONTWRITEBYTECODE=1
[英]Python3 project remove __pycache__ folders and .pyc files
從 python3 項目中清除所有__pycache__
文件夾和.pyc/.pyo
文件的最佳方法是什么。 我看到多個用戶建議使用 Debian 捆綁的pyclean
腳本,但這不會刪除文件夾。 在將文件推送到我的 DVS 之前,我想要一種簡單的方法來清理項目。
您可以使用下一個命令手動執行此操作:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
這將遞歸刪除當前目錄中的所有*.pyc文件和__pycache__目錄。
BSD 在 macOS 上的find
實現與 GNU find 不同 - 這與 BSD 和 GNU find 兼容。 從通配實現開始,使用-name
和-o
for or - 將此函數放入您的.bashrc
文件中:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
然后cd
到要遞歸清理的目錄,然后鍵入pyclean
。
這是一個 GNU find,只有(即 Linux)解決方案,但我覺得使用正則表達式更好一點:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
在 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 進程)。
當我將 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 .
很好地清理了它。
由於這是一個 Python 3 項目,您只需要刪除__pycache__
目錄——所有.pyc
/ .pyo
文件都在其中。
find . -type d -name __pycache__ -exec rm -r {} \+
或者更簡單的形式,
find . -type d -name __pycache__ -delete
由於某種原因,這對我不起作用(文件被刪除但目錄沒有),所以為了完整起見,我將兩者都包括在內。
或者,如果您在修訂控制下的目錄中執行此操作,您可以告訴 RCS 遞歸忽略__pycache__
文件夾。 然后,在需要的時候,只需清理所有被忽略的文件。 這可能會更方便,因為可能要清理的不僅僅是__pycache__
。
如果您需要一個永久的解決方案來將 Python 緩存文件保留在您的項目目錄之外:
從Python 3.8開始,您可以使用環境變量PYTHONPYCACHEPREFIX
為 Python 定義緩存目錄。
來自 Python 文檔:
如果設置,Python 將在此路徑的鏡像目錄樹中寫入 .pyc 文件,而不是在源樹中的pycache目錄中。 這等效於指定 -X pycache_prefix=PATH 選項。
例子
如果您./profile
添加到 Linux 中的./profile
:
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Python 不會在您的項目目錄中創建煩人的__pycache__
目錄,而是將它們全部放在~/.cache/cpython/
我用過的命令:
find . -type d -name "__pycache__" -exec rm -r {} +
說明:
首先在當前目錄中查找所有__pycache__
文件夾。
執行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
}
希望能幫助到你 !!!
這是我的別名,適用於 Python 2 和 Python 3,以遞歸方式刪除所有.pyc .pyo
文件以及__pycache__
目錄。
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
在Project Tool Window
,右鍵單擊應從中刪除 Python 編譯文件的項目或目錄。
在上下文菜單上,選擇Clean Python compiled files
。
駐留在所選目錄中的.pyc
文件將被靜默刪除。
從項目目錄中鍵入以下內容:
刪除所有.pyc文件
find . -path "*/*.pyc" -delete
刪除所有.pyo文件:
find . -path "*/*.pyo" -delete
最后,要刪除所有'__pycache__' ,請鍵入:
find . -path "*/__pycache__" -type d -exec rm -r {} ';'
如果遇到權限被拒絕錯誤,請在上述所有命令的開頭添加sudo 。
非常感謝其他答案,基於它們,這是我用於 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
為什么不直接使用rm -rf __pycache__
? 之后運行git add -A
以將它們從您的存儲庫中刪除並將__pycache__/
添加到您的 .gitignore 文件中。
盡可能簡單
#!/bin/bash
project_root_dir=$(pwd)
#
# function _dcache deletes __pycache__ folders floating around python modules
#
function _dcache() {
find "$project_root_dir/inb" -name "__pycache__" > pycache
while IFS= read -r cache_file; do
rm -r $cache_file
done < pycache
rm pycache
}
這是我在我的項目中使用的。 你可以試一試。
首先清空目錄,然后刪除它們:
find ./ -type f -name '*.pyc' -delete -print && find ./ -type d -name '__pycache__' -delete -print
有一個不錯的 pip 包。
pip install pyclean
pyclean --verbose .
完畢
我在 Mac 上運行 Python3 和 pip3。 對我來說,解決方法如下(在我項目的根目錄下):
pip3 install pyclean
pyclean .
我想強調一下,因為我看到許多涉及 bash 腳本的答案,因此軟件中的最佳實踐是支持經過測試的問題解決方案(這正是已建立的 python 包所代表的)而不是手動方法。
大多數時候,您的項目都在源代碼控制之下; 如果使用git
,則只需運行git clean -d -f.
清理非版本控制文件; 如果 Python 緩存文件/目錄在.gitignore
中,您還需要-x
(也刪除忽略的文件)或-X
(僅刪除忽略的文件)命令行開關。
請注意,如果您有任何必須保存的臨時文件,請將它們移出本地存儲庫或添加到索引樹,然后再運行git clean
without -X
。
請前往您的終端,然后輸入:
$rm __pycache__
它將被刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.