Python3 प्रोजेक्ट __pycache__ फ़ोल्डर्स और .pyc फ़ाइलों को हटाता है


166

Python3 प्रोजेक्ट से सभी __pycache__ फ़ोल्डर्स और .pyc/.pyoफ़ाइलों को हटाने का सबसे अच्छा तरीका क्या है । मैंने कई उपयोगकर्ताओं pycleanको डेबियन के साथ बंडल की गई स्क्रिप्ट का सुझाव देते हुए देखा है , लेकिन यह फ़ोल्डर्स को नहीं हटाता है। मैं अपने DVS के लिए फ़ाइलों को आगे बढ़ाने से पहले परियोजना को साफ करने का एक सरल तरीका चाहता हूं।

जवाबों:


241

आप इसे मैन्युअल रूप से अगले आदेश के साथ कर सकते हैं:

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

यह वर्तमान निर्देशिका में सभी * .pyc फ़ाइलों और __pycache__ निर्देशिकाओं को हटा देगा ।


8
आदेश गंदा है। यह भी हटा देगा *__pycache__, *.pyc*और यह फ़ाइलों और निर्देशिकाओं के बीच अंतर नहीं करता है। अधिकांश उत्पन्न rmआदेश भी अतिरेकपूर्ण होंगे।
ivan_pozdeev

12
यह सिर्फ गलत है। ऐसा नहीं है कि आप कैसे और findgrepही उपयोग करते हैं rmऔर यह किसी भी मौजूदा कामकाजी निर्देशिका के लिए खतरनाक हो सकता है जिसमें शामिल हो सकता है useful.pycle.jsonया important_deployment_setting_about__pycache__.txtआदि जो मैं एसओ के पूरे उपयोगकर्ता आधार पर बाहर नहीं होगा। यह उल्लेख करने के लिए नहीं कि कैसे (खतरनाक तरीके से rm -rf) टूटी हुई xargsनाम से व्हाट्सएप के साथ एक फ़ाइल द्वारा होगी। इसलिए मैंने इसे संपादित किया ...
dlamblin

@dwanderson मुझे लगता है कि आप एक अलग जवाब के बारे में बात कर रहे हैं; या तो SO इतिहास को संपादित नहीं करता है और पूरा इतिहास नहीं दिखाता है कि 2017 में एक संस्करण था जो वहां नहीं दिखाया गया है?
डाम्ब्लिन

2
OSX पर काम नहीं करताgrep: parentheses not balanced
डैनियल डब्ल्यू

85

मुझे खुद ही इसका जवाब मिला जब मैंने पाइक्लिन को पाइक्लीन के रूप में गलत समझा:

    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 के अनुसार, मैकोस / होमब्रे में, मुझे पाइप से पैकेज पाइक्लाइनर का उपयोग करना था, और इसे निष्पादित करने के लिए कमांड पाइक्लाइनर है। अजगर 2 ही।
विलियन मित्सुडा

3
python3-minimal केवल डेबियन पर उपलब्ध है (RHEL, CentOS, काढ़ा, MacOS पर नहीं मिल रहा है)
user12345

1
अजीब तरह से, मेरा स्थापित py3clean (3.5.1-3) वास्तव में कुछ भी नहीं करता है, उन फ़ाइलों में से कोई भी साफ़ नहीं करता है और बस चुपचाप रिटर्न (अजगर 3.6.5) देता है।
Matanster

4
यह __pycache__फोल्डर डिलीट नहीं करता है , न ही .pycफाइल्स (डेबियन पर टेस्ट किया हुआ)
EricLavault

82

macOS और लिनक्स

findMacOS पर BSD का कार्यान्वयन GNU खोज से भिन्न है - यह BSD और GNU दोनों के साथ संगत है। ग्लोबिंग कार्यान्वयन के साथ प्रारंभ करें, उपयोग -nameऔर इसके -oलिए या - इस फ़ंक्शन को अपनी .bashrcफ़ाइल में रखें :

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

फिर cdजिस डाइरेक्टरी को आप फिर से साफ करना चाहते हैं, उसे टाइप करें pyclean

GNU केवल-खोजने के लिए

यह एक GNU खोज है, केवल (यानी लिनक्स) समाधान है, लेकिन मुझे लगता है कि यह regex के साथ थोड़ा अच्छा है:

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

पायथन 3 का उपयोग करते हुए कोई भी मंच

विंडोज पर, आपके पास शायद नहीं भी है find। हालाँकि, आपके पास शायद पायथन 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झंडा अजगर बताता है लिखने के लिए नहीं .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 में या उसके नीचे कोर नाम वाली फ़ाइलें खोजें और उन्हें हटा दें, लेकिन पिछले उदाहरण की तुलना में अधिक कुशलता से (क्योंकि हम rm लॉन्च करने के लिए कांटा (2) और निष्पादन (2) का उपयोग करने की आवश्यकता से बचते हैं और हमें इसकी आवश्यकता नहीं है) अतिरिक्त xargs प्रक्रिया)।


आप शायद का उपयोग करके एक लाइन के लिए अजगर संस्करण मिल सकता है shutil.rmteeपर __pycache__बजाय उन्हें पहले खाली करने की निर्देशिका; एक-लाइनर एक आसान उपनाम के लिए अच्छा हो सकता है। मैं अभी का एक बड़ा प्रशंसक हूं Path, हालांकि मुझे लगता है कि मैं अपनी स्क्रिप्ट में उस संस्करण का उपयोग करूंगा।
नाथन

25

चूंकि यह पायथन 3 परियोजना है, आपको केवल __pycache__निर्देशिकाओं को हटाने की आवश्यकता है - सभी .pyc/ .pyoफाइलें उनके अंदर हैं।

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

या इसका सरल रूप,

find . -type d -name __pycache__ -delete

जो किसी कारण से मेरे लिए काम नहीं करता था (फाइलें हटा दी गई थीं लेकिन निर्देशिकाएं नहीं थीं), इसलिए मैं पूर्णता के लिए दोनों को शामिल कर रहा हूं।


वैकल्पिक रूप से, यदि आप ऐसा किसी निर्देशिका में कर रहे हैं जो संशोधन नियंत्रण में है, तो आप आरसीएस को __pycache__फ़ोल्डरों की पुनरावृत्ति को अनदेखा करने के लिए कह सकते हैं । फिर, आवश्यक क्षण में, केवल सभी उपेक्षित फ़ाइलों को साफ करें। यह संभवत: अधिक सुविधाजनक होगा क्योंकि शायद सिर्फ साफ करने के लिए और अधिक होगा __pycache__


नहीं, सभी .pycफाइलें इसके अंदर नहीं हैं।
मार्टिन थोमा

@ V. Gamula यह एक बहुत ही सुरक्षित आदेश है ~ 114 लोगों की तुलना में बहुत भाग्यशाली थे जो उन्हें गलती से मैच के स्थायी हटाने के साथ नहीं काटते थे।
dlamblin

एक परियोजना केवल पायथन 3 में @MartinThoma?
dlamblin

4
क्या मैं यहां केवल Directory not emptyदूसरे संस्करण के साथ मिल रहा हूं ?
Matanster

13

यह मेरा उपनाम है जो पायथन 2 और पायथन 3 दोनों के साथ काम करता है और सभी .pyc .pyoफाइलों को हटाकर __pycache__पुन: निर्देशित करता है।

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

बहुत बहुत धन्यवाद। इसने मुझे अपने रेपो के लिए उन सभी अनावश्यक फाइलों से छुटकारा पाने में मदद की।
हर्ष अग्रवाल

13

यदि आपको अपने प्रोजेक्ट निर्देशिका से पायथन कैश फ़ाइलों को रखने के लिए एक स्थायी समाधान की आवश्यकता है :

अजगर 3.8 के साथ शुरू करके आप PYTHONPYCACHEPREFIXपायथन के लिए कैश डायरेक्टरी को परिभाषित करने के लिए पर्यावरण चर का उपयोग कर सकते हैं ।

पायथन डॉक्स से:

यदि यह सेट किया गया है, तो पायथन इस पथ पर एक मिरर डायरेक्टरी ट्री में .pyc फाइलें लिखेगा, बजाय सोर्स ट्री के भीतर pycache डायरेक्टरीज़ के। यह -X pycache_prefix = PATH विकल्प को निर्दिष्ट करने के बराबर है।

उदाहरण

यदि आप ./profileलिनक्स में अपने लिए निम्न पंक्ति जोड़ते हैं :

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

अजगर __pycache__आपकी परियोजना निर्देशिका में कष्टप्रद निर्देशिकाओं का निर्माण नहीं करेगा , इसके बजाय यह उन सभी को नीचे रख देगा~/.cache/cpython/


4
धन्यवाद अच्छा है कि यह आ रहा है। Pycache कूड़े निर्देशिका एक बड़ी गलती कर रहे थे।
सारा G

7

मैंने जो कमांड प्रयोग किया है:

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

बताते हैं:

  1. पहले सभी __pycache__फ़ोल्डर को वर्तमान निर्देशिका में पाता है ।

  2. rm -r {} +ऊपर दिए गए चरण में प्रत्येक फ़ोल्डर को हटाने के लिए निष्पादित करें ( {} प्लेसहोल्डर के लिए संकेत दें और +कमांड को समाप्त करने के लिए)

संपादित 1:

मैं लिनक्स का उपयोग कर रहा हूं, उस कमांड का पुन: उपयोग करने के लिए जिसे मैंने ~/.bashrcफाइल के नीचे लाइन में जोड़ा है

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

संपादित 2: यदि आप VS कोड का उपयोग कर रहे हैं , तो आपको __pycache__मैन्युअल रूप से निकालने की आवश्यकता नहीं है । आप settings.jsonफ़ाइल के नीचे स्निपेट जोड़ सकते हैं । उसके बाद, वीएस कोड__pycache__ आपके लिए सभी फ़ोल्डरों को छिपा देगा

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

आशा करता हूँ की ये काम करेगा !!!


4

PyCharm का उपयोग करना

पायथन संकलित फ़ाइलों को हटाने के लिए

  1. में Project Tool Window, किसी प्रोजेक्ट या निर्देशिका को राइट-क्लिक करें, जहां पायथन संकलित फ़ाइलों को हटा दिया जाना चाहिए।

  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फ़ाइल के लिए उपयोग किया है :

#!/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
वह मैन्युअल रूप से ऐसा नहीं कर रहा है। वह इसे एक डेबियन पैकेज में प्रयुक्त स्क्रिप्ट में जोड़ने की कोशिश कर रहा है। डेबियन पैकेज का उपयोग git के साथ नहीं, बल्कि डेबियन पैकेज मैनेजर या apt इंस्टॉलर के साथ किया जाता है।
क्रेग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.