โครงการ Python3 ลบ __pycache__ โฟลเดอร์และไฟล์ .pyc


166

เป็นวิธีที่ดีที่สุดในการล้าง__pycache__ โฟลเดอร์และ.pyc/.pyoไฟล์ทั้งหมดจากโครงการ python3 ฉันเคยเห็นผู้ใช้หลายคนแนะนำpycleanสคริปต์ที่มาพร้อมกับ Debian แต่นี่ไม่ได้ลบโฟลเดอร์ ฉันต้องการวิธีง่ายๆในการทำความสะอาดโครงการก่อนที่จะส่งไฟล์ไปยัง DVS ของฉัน

คำตอบ:


241

คุณสามารถทำได้ด้วยตนเองด้วยคำสั่งต่อไป:

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

สิ่งนี้จะลบทุกไฟล์* .pycและไดเรกทอรี__pycache__ซ้ำในไดเรกทอรีปัจจุบันซ้ำ


8
คำสั่งสกปรก นอกจากนี้ยังจะลบ*__pycache__, *.pyc*และจะไม่เห็นความแตกต่างระหว่างไฟล์และไดเรกทอรี rmคำสั่งที่สร้างขึ้นส่วนใหญ่จะฟุ่มเฟือย
ivan_pozdeev

12
นี่เป็นเพียงความผิด นั่นไม่ใช่วิธีที่คุณใช้findหรือgrepไม่rmและมันอาจเป็นอันตรายสำหรับไดเรกทอรีการทำงานปัจจุบันใด ๆ ที่อาจมีuseful.pycle.jsonหรือimportant_deployment_setting_about__pycache__.txtอื่น ๆ ซึ่งฉันจะไม่แยกออกจากฐานผู้ใช้ทั้งหมดของ SO ไม่ต้องพูดถึงวิธีการ (อันตรายrm -rf) แตกxargsโดยไฟล์ที่มีช่องว่างในชื่อ ดังนั้นฉันจึงแก้ไขได้ ...
dlamblin

@dandanderson ฉันคิดว่าคุณกำลังพูดถึงคำตอบอื่น หรือดังนั้นการแก้ไขประวัติจะไม่แสดงประวัติที่สมบูรณ์ EG อีกต่อไปมีรุ่นในปี 2017 ที่ไม่แสดงที่นั่น?
dlamblin

2
ไม่ทำงานใน OSXgrep: parentheses not balanced
แดเนียลดับบลิว

85

ฉันพบคำตอบด้วยตัวเองเมื่อฉันพิมพ์ผิด 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 .ทำความสะอาดมันขึ้นอย่างมาก


6
py3clean นั้นเข้มงวดกว่าคำสั่งของ @ V.Gamula: จะไม่ลบไฟล์. pyc ที่สร้างจากไฟล์ต้นฉบับที่ถูกลบตั้งแต่นั้น
Jérôme

1
ตั้งแต่พฤษภาคม 2017 ใน macos / homebrew ฉันต้องใช้แพ็กเกจ pycleaner จาก pip และคำสั่งเพื่อดำเนินการมันคือ pycleaner Python 2 เท่านั้น
Willian Mitsuda

3
python3-minimal ดูเหมือนว่าจะมีอยู่ใน Debian เท่านั้น (ไม่พบใน RHEL, CentOS, การผลิต, MacOS)
12345

1
ผิดปกติเพียงพอ py3clean ที่ติดตั้งของฉัน (3.5.1-3) ไม่ทำอะไรเลยจริง ๆ ลบไฟล์เหล่านั้นไม่ได้เลยแล้วก็ส่งคืนอย่างเงียบ ๆ (python 3.6.5)
matanster

4
ไม่ลบ__pycache__โฟลเดอร์หรือ.pycไฟล์ (ทดสอบโดย debian)
EricLavault

82

macOS & Linux

findการใช้งานของ BSD บน macOS นั้นแตกต่างจาก GNU find ซึ่งสามารถใช้งานได้กับทั้ง BSD และ GNU find เริ่มต้นด้วยการใช้งานแบบวนรอบการใช้-nameและ-oสำหรับหรือ - ใส่ฟังก์ชันนี้ใน.bashrcไฟล์ของคุณ:

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

จากนั้นไปยังไดเรกทอรีที่คุณต้องการทำความสะอาดซ้ำและประเภทcdpyclean

GNU ค้นหาอย่างเดียว

นี่เป็น GNU find, ทางออกเดียว (เช่น 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

ค้นหาไฟล์ชื่อ core ในหรือด้านล่าง directory / tmp และลบออก แต่มีประสิทธิภาพมากกว่าในตัวอย่างก่อนหน้า (เพราะเราหลีกเลี่ยงความต้องการใช้ fork (2) และ exec (2) เพื่อเรียกใช้ rm และเราไม่ต้องการ กระบวนการ xargs พิเศษ)


คุณอาจจะได้รับเวอร์ชันหลามเป็นหนึ่งบรรทัดโดยใช้shutil.rmteeใน__pycache__ไดเรกทอรีแทนที่จะล้างพวกเขาก่อน; ซับหนึ่งอาจจะดีสำหรับนามแฝงง่าย อย่างไรก็ตามฉันเป็นแฟนตัวยงของPathตอนนี้ดังนั้นฉันคิดว่าฉันจะใช้เวอร์ชันนั้นในสคริปต์ของฉัน
นาธาน

25

เนื่องจากนี่เป็นโครงการ Python 3 คุณจะต้องลบ__pycache__ไดเรกทอรีทั้งหมด.pyc/ .pyoไฟล์อยู่ในนั้น

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

หรือรูปแบบที่เรียบง่าย

find . -type d -name __pycache__ -delete

ซึ่งไม่ทำงานสำหรับฉันด้วยเหตุผลบางอย่าง (ไฟล์ถูกลบ แต่ไดเรกทอรีไม่ได้) ดังนั้นฉันจึงรวมทั้งทั้งสองไว้เพื่อความสมบูรณ์


หรือถ้าคุณทำเช่นนี้ในไดเรกทอรีที่อยู่ภายใต้การควบคุมการแก้ไขคุณสามารถบอก RCS ให้เพิกเฉยต่อ__pycache__โฟลเดอร์ซ้ำ ๆ จากนั้นในเวลาที่ต้องการเพียงล้างไฟล์ที่ถูกละเว้นทั้งหมด __pycache__นี้มีแนวโน้มที่จะได้รับความสะดวกมากขึ้นเพราะมีอาจจะมีมากขึ้นในการทำความสะอาดมากกว่าเพียงแค่


ไม่.pycไฟล์ทั้งหมดอยู่ข้างใน
Martin Thoma

@ V.Gamula นี่เป็นคำสั่งที่ปลอดภัยกว่าคน ~ 114 คนโชคดีมากที่ไม่กัดพวกเขาด้วยการลบถาวรของการแข่งขันที่ผิดพลาด
dlamblin

@MartinThoma ในโครงการ python3 เท่านั้นหรือ
dlamblin

4
ฉันเป็นคนเดียวที่ได้รับDirectory not emptyกับตัวแปรที่สองที่นี่?
matanster

13

นี่คือนามแฝงของฉันที่ทำงานได้ทั้งกับ Python 2 และ Python 3 ลบ.pyc .pyoไฟล์ทั้งหมดรวมทั้ง__pycache__ไดเรกทอรีซ้ำ

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

ขอบคุณมาก. มันช่วยให้ฉันกำจัดไฟล์ที่ไม่จำเป็นทั้งหมดสำหรับ repos ของฉัน
Harsh Aggarwal

13

หากคุณต้องการวิธีแก้ไขปัญหาอย่างถาวรในการเก็บไฟล์แคช Python ออกจากไดเรกทอรีโครงการของคุณ:

เริ่มต้นด้วยPython 3.8คุณสามารถใช้ตัวแปรสภาพแวดล้อมPYTHONPYCACHEPREFIXเพื่อกำหนดไดเรกทอรีแคชสำหรับ Python

จาก Python docs:

หากมีการตั้งค่าไว้ Python จะเขียนไฟล์. pyc ในแผนผังไดเร็กทอรีมิรเรอร์ที่พา ธ นี้แทนในไดเร็กทอรีpycacheภายในแผนผังซอร์ส นี่เทียบเท่ากับการระบุอ็อพชัน -X pycache_prefix = PATH

ตัวอย่าง

หากคุณเพิ่มบรรทัดต่อไปนี้./profileใน Linux:

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

Python จะไม่สร้าง__pycache__ไดเรกทอรีที่น่ารำคาญในไดเรกทอรีโครงการของคุณ แต่มันจะใส่ไว้ในไดเรกทอรีทั้งหมด~/.cache/cpython/


4
ขอบคุณพระเจ้าที่กำลังจะมา pycacheไดเรกทอรีครอกเป็นความผิดพลาด
ซาราห์ G

7

คำสั่งที่ฉันใช้:

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จะซ่อน__pycache__โฟลเดอร์ทั้งหมดสำหรับคุณ

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

หวังว่ามันจะช่วย !!!


4

ใช้ PyCharm

เพื่อลบไฟล์ที่รวบรวม Python

  1. ในProject Tool Windowคลิกขวาที่โปรเจ็กต์หรือไดเร็กทอรีซึ่งไฟล์ที่รวบรวม Python ควรถูกลบออก

  2. Clean Python compiled filesในเมนูบริบทให้เลือก

.pycไฟล์พำนักอยู่ในไดเรกทอรีที่เลือกจะถูกลบออกอย่างเงียบ ๆ


4

จากไดเรกทอรีโครงการพิมพ์ดังต่อไปนี้:

การลบไฟล์. pycทั้งหมด

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

การลบไฟล์. pyoทั้งหมด:

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

สุดท้ายหากต้องการลบ'__pycache__' ทั้งหมดให้พิมพ์:

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

หากคุณพบข้อผิดพลาดที่ได้รับอนุญาตปฏิเสธเพิ่มsudoที่จุดเริ่มต้นของคำสั่งทั้งหมดข้างต้น


2

ขอบคุณมากสำหรับคำตอบอื่น ๆ ตามพวกเขานี่คือสิ่งที่ฉันใช้สำหรับprermไฟล์แพคเกจ Debian ของฉัน:

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

ทำไมไม่ใช้เพียงrm -rf __pycache__? รันgit add -Aหลังจากนั้นเพื่อลบออกจากที่เก็บของคุณและเพิ่มลง__pycache__/ในไฟล์. gitignore ของคุณ


1
เขาไม่ได้ทำสิ่งนี้ด้วยตนเอง เขากำลังพยายามเพิ่มลงในสคริปต์ที่ใช้ในแพ็คเกจ Debian แพ็คเกจ debian ไม่ได้ใช้กับ git แต่ใช้กับผู้จัดการแพ็คเกจ debian หรือ apt installer
Craig

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.