Dự án Python3 xóa các thư mục __pycache__ và các tệp .pyc


166

Cách TỐT NHẤT để xóa tất cả các __pycache__ thư mục và .pyc/.pyotệp từ dự án python3. Tôi đã thấy nhiều người dùng đề xuất pycleantập lệnh đi kèm với Debian, nhưng điều này không xóa các thư mục. Tôi muốn một cách đơn giản để dọn sạch dự án trước khi đẩy các tệp vào DVS của tôi.

Câu trả lời:


241

Bạn có thể làm điều đó bằng tay với lệnh tiếp theo:

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

Thao tác này sẽ xóa tất cả các tệp * .pyc và các thư mục __pycache__ theo cách đệ quy trong thư mục hiện tại.


8
Lệnh bẩn. Nó cũng sẽ xóa *__pycache__, *.pyc*và nó không phân biệt giữa các tập tin và thư mục. Hầu hết các rmlệnh được tạo cũng sẽ là thừa.
ivan_pozdeev

12
Điều này chỉ sai. Đó không phải là cách bạn sử dụng findcũng như grepkhông rmvà nó có thể gây nguy hiểm cho bất kỳ thư mục làm việc hiện tại nào có thể chứa useful.pycle.jsonhoặc important_deployment_setting_about__pycache__.txtv.v. Tôi không loại trừ trên toàn bộ cơ sở người dùng của SO. Không đề cập đến việc (nguy hiểm rm -rf) bị phá vỡ như thế nào xargsbởi một tệp có khoảng trắng trong tên. Vì vậy, tôi đã chỉnh sửa nó
dlamblin

@dwanderson Tôi nghĩ bạn đang nói về một câu trả lời khác nhau; hoặc lịch sử chỉnh sửa SO không còn hiển thị toàn bộ lịch sử EG có phiên bản năm 2017 không được hiển thị ở đó không?
dlamblin

2
Không hoạt động trên OSXgrep: parentheses not balanced
Daniel W.

85

Tôi đã tìm thấy câu trả lời cho chính mình khi tôi nhầm lẫn pyclean là 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

Chạy py3clean .làm sạch nó lên rất độc đáo.


6
py3clean bảo thủ hơn lệnh của @ V.Gamula: nó không xóa các tệp .pyc được tạo từ các tệp nguồn đã bị xóa kể từ đó.
Jérôme

1
Kể từ tháng 5 năm 2017, trong macos / homebrew, tôi đã phải sử dụng gói pycleaner từ pip và lệnh để thực thi nó là pycleaner. Python 2 thôi.
Willian Mitsuda

3
python3-Minimal dường như chỉ khả dụng trên Debian (không tìm thấy nó trên RHEL, CentOS, brew, MacOS)
user12345

1
Thật kỳ lạ, py3clean đã cài đặt của tôi (3.5.1-3) thực sự không có gì, thực sự không xóa các tệp đó và chỉ đơn giản là âm thầm trả về (python 3.6.5).
matanster

4
Nó không xóa __pycache__các thư mục, cũng không phải .pyccác tệp (được thử nghiệm trên debian)
EricLavault

82

macOS & Linux

Việc findtriển khai BSD trên macOS khác với GNU find - điều này tương thích với cả BSD và GNU find. Bắt đầu với việc triển khai toàn cầu, sử dụng -name-ocho hoặc - Đặt chức năng này trong .bashrctệp của bạn :

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

Sau đó cdđến thư mục bạn muốn làm sạch đệ quy và gõ pyclean.

GNU chỉ tìm

Đây là một giải pháp GNU find, only (tức là Linux), nhưng tôi cảm thấy nó đẹp hơn một chút với biểu thức chính quy:

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

Bất kỳ nền tảng nào, sử dụng Python 3

Trên Windows, bạn có thể thậm chí không có find. Tuy nhiên, bạn có thể có Python 3, bắt đầu từ 3.4 có pathlibmô-đun thuận tiện :

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

Các -Blá cờ nói với Python không để viết .pyctập tin. (Xem thêm PYTHONDONTWRITEBYTECODEbiến môi trường.)

Các lạm dụng ở trên liệt kê sự hiểu biết cho vòng lặp, nhưng khi sử dụng python -c, phong cách là một mối quan tâm thứ yếu. Ngoài ra, chúng tôi có thể lạm dụng (ví dụ) __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()"

Phê bình một câu trả lời

Câu trả lời hàng đầu được sử dụng để nói:

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

Điều này dường như sẽ kém hiệu quả hơn vì nó sử dụng ba quy trình. findcó một biểu thức chính quy, vì vậy chúng ta không cần một lệnh gọi riêng grep. Tương tự như vậy, nó không có -delete, vì vậy chúng ta không cần một lời mời riêng biệt rmvà ngược lại với một nhận xét ở đây, nó sẽ xóa các thư mục không trống miễn là chúng bị xóa bởi tính phù hợp của biểu thức chính quy.

Từ xargstrang người đàn ông:

find /tmp -depth -name core -type f -delete

Tìm các tệp có tên core trong hoặc bên dưới thư mục / tmp và xóa chúng, nhưng hiệu quả hơn trong ví dụ trước (vì chúng tôi tránh việc phải sử dụng fork (2) và exec (2) để khởi chạy rm và chúng tôi không cần quá trình xargs thêm).


Bạn có thể có được phiên bản python đến một dòng bằng cách sử dụng shutil.rmteetrên các __pycache__thư mục thay vì làm trống chúng trước; một lớp lót có thể là tốt cho một bí danh dễ dàng. PathTuy nhiên, bây giờ tôi là một fan hâm mộ lớn , vì vậy tôi nghĩ rằng tôi sẽ sử dụng phiên bản đó trong kịch bản của mình.
Nathan

25

Vì đây là dự án Python 3, bạn chỉ cần xóa các __pycache__thư mục - tất cả .pyc/ .pyotệp nằm trong chúng.

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

hoặc hình thức đơn giản hơn của nó,

find . -type d -name __pycache__ -delete

Điều này không phù hợp với tôi vì một số lý do (các tệp đã bị xóa nhưng các thư mục không có), vì vậy tôi bao gồm cả hai vì mục đích hoàn chỉnh.


Ngoài ra, nếu bạn đang thực hiện việc này trong một thư mục nằm dưới sự kiểm soát sửa đổi, bạn có thể yêu cầu RCS bỏ qua __pycache__các thư mục theo cách đệ quy. Sau đó, tại thời điểm cần thiết, chỉ cần dọn sạch tất cả các tệp bị bỏ qua. Điều này có thể sẽ thuận tiện hơn vì có lẽ sẽ có nhiều thứ để dọn dẹp hơn là chỉ __pycache__.


Không, không phải tất cả .pyccác tập tin đều nằm trong đó.
Martin Thoma

@ V.Gamula Đây là một lệnh an toàn hơn đáng kể so với một người ~ 114 người may mắn đã không cắn họ với việc xóa vĩnh viễn một trận đấu nhầm.
dlamblin

@MartinThoma trong một dự án chỉ python3?
dlamblin

4
Tôi có phải là người duy nhất nhận được Directory not emptyvới biến thể thứ hai ở đây không?
matanster

13

Đây là bí danh của tôi hoạt động cả với Python 2 và Python 3 loại bỏ tất cả .pyc .pyocác tệp cũng như các __pycache__thư mục theo cách đệ quy.

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

Cảm ơn rất nhiều. Nó giúp tôi loại bỏ tất cả các tệp không cần thiết cho repos của tôi.
Harsh Aggarwal

13

Nếu bạn cần một giải pháp vĩnh viễn để giữ các tệp bộ đệm Python khỏi các thư mục dự án của bạn:

Bắt đầu với Python 3.8, bạn có thể sử dụng biến môi trường PYTHONPYCACHEPREFIXđể xác định thư mục bộ đệm cho Python.

Từ các tài liệu Python:

Nếu điều này được đặt, Python sẽ ghi các tệp .pyc vào cây thư mục nhân bản tại đường dẫn này, thay vì trong các thư mục pycache trong cây nguồn. Điều này tương đương với việc chỉ định tùy chọn -X pycache_prefix = PATH.

Thí dụ

Nếu bạn thêm dòng sau ./profilevào Linux của bạn :

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

Python sẽ không tạo các __pycache__thư mục gây phiền nhiễu trong thư mục dự án của bạn, thay vào đó, nó sẽ đặt tất cả chúng vào~/.cache/cpython/


4
Cảm ơn trời, điều này đang đến. Các thư mục xả rác pycache là một sai lầm.
Sarah G

7

Lệnh tôi đã sử dụng:

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

Giải thích:

  1. Đầu tiên tìm thấy tất cả các __pycache__thư mục trong thư mục hiện tại.

  2. Thực hiện rm -r {} +để xóa từng thư mục ở bước trên ( {} biểu thị cho giữ chỗ và +kết thúc lệnh)

Đã chỉnh sửa 1:

Tôi đang sử dụng Linux, để sử dụng lại lệnh Tôi đã thêm dòng bên dưới vào ~/.bashrctệp

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

Đã chỉnh sửa 2: Nếu bạn đang sử dụng Mã VS , bạn không cần xóa __pycache__thủ công. Bạn có thể thêm đoạn mã dưới đây vào settings.jsontệp. Sau đó, Mã VS sẽ ẩn tất cả các __pycache__thư mục cho bạn

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

Hy vọng nó giúp !!!


4

Sử dụng PyCharm

Để xóa các tệp được biên dịch Python

  1. Trong Project Tool Window, bấm chuột phải vào một dự án hoặc thư mục, nơi các tệp được biên dịch Python sẽ bị xóa khỏi.

  2. Trên menu ngữ cảnh, chọn Clean Python compiled files.

Các .pyctập tin trong thư mục đã chọn sẽ âm thầm bị xóa.


4

Từ thư mục dự án gõ như sau:

Xóa tất cả các tệp .pyc

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

Xóa tất cả các tệp .pyo :

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

Cuối cùng, để xóa tất cả '__pycache__' , gõ:

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

Nếu bạn gặp phải quyền bị từ chối lỗi, hãy thêm sudo vào đầu của tất cả các lệnh trên.


2

Cảm ơn rất nhiều về các câu trả lời khác, dựa trên chúng, đây là những gì tôi đã sử dụng cho prermtệp Debian của gói :

#!/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

0

Tại sao không chỉ sử dụng rm -rf __pycache__? Chạy git add -Asau đó để xóa chúng khỏi kho lưu trữ của bạn và thêm __pycache__/vào tệp .gitignore của bạn.


1
Anh ấy không làm điều này bằng tay. Anh ta đang cố gắng thêm nó vào một tập lệnh được sử dụng trong gói Debian. Gói debian không được sử dụng với git mà với trình quản lý gói debian hoặc trình cài đặt apt.
Craig

-13

Vui lòng chỉ đến thiết bị đầu cuối của bạn sau đó gõ:

$rm __pycache__

và nó sẽ được gỡ bỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.