__Pycache__ क्या है?


651

मुझे जो समझ में आया है, कैश एक समान फ़ाइलों की एन्क्रिप्टेड फ़ाइल है।

हम __pycache__फ़ोल्डर के साथ क्या करते हैं ? क्या यह वही है जो हम अपने स्रोत कोड के बजाय लोगों को देते हैं? क्या यह सिर्फ मेरा इनपुट डेटा है? यह फ़ोल्डर बनता रहता है, इसके लिए क्या है?


29
"क्या यह है कि हम अपने स्रोत कोड के बजाय लोगों को क्या देते हैं?" - नहीं, आप उन्हें एक अच्छा इंस्टाल करने योग्य पैकेज में सोर्स कोड देते हैं ताकि इसका उपयोग करना आसान हो।
लेन्नर्ट रेगेब्र

79
अभी तक किसी ने भी उल्लेख नहीं किया है, लेकिन कैश की आपकी परिभाषा विचित्र है। कैश काफी सरलता से एक घटक है जो डेटा को संग्रहीत करता है ताकि भविष्य में उस डेटा के लिए अनुरोध तेजी से परोसा जा सके
रिकार्डो क्रूज़


1
चूंकि Python 3.8आप कष्टप्रद कैश निर्देशिकाओं के लिए स्थान बदलने के लिए एक पर्यावरण चर का उपयोग कर सकते हैं : stackoverflow.com/a/57414308/1612318
14

एक कैश एक ऐसी चीज है जो सामान की एक प्रतिलिपि रखता है यदि आपको इसे फिर से आवश्यकता है, तो आपको इसे प्राप्त करने के लिए मूल पर वापस जाने के लिए सहेजना होगा। यह मूल स्थान पर जाने की तुलना में तेज़ होने के लिए डिज़ाइन किया गया है। यह तेज़ हो सकता है क्योंकि इसमें जानकारी को पूर्व-संसाधित या संकलित करने की आवश्यकता नहीं है। या यह तेजी से भंडारण हो सकता है, उदाहरण के लिए रैम में डिस्क कैश या स्थानीय डिस्क पर वेब कैश। यह इसकी प्रकृति से एन्क्रिप्टेड नहीं है (हालांकि यह कभी-कभी हो सकता है), और यह हमेशा "समान फ़ाइलों की फ़ाइल" नहीं है - यह एक फ़ाइल, फ़ाइलों का भार, रैम का एक खंड आदि हो सकता है
rjmunro

जवाबों:


518

जब आप अजगर में एक कार्यक्रम चलाते हैं, तो दुभाषिया पहले इसे बायटेकोड पर संकलित करता है (यह एक ओवरसाइप्लाइजेशन है) और इसे __pycache__फ़ोल्डर में संग्रहीत करता है । यदि आप वहां देखते हैं तो आपको अपने प्रोजेक्ट के फ़ोल्डर में .py फ़ाइलों के नाम साझा करने वाली फ़ाइलों का एक गुच्छा मिलेगा, केवल उनकी या तो .pyc या .pyo होगी। ये क्रमशः आपके प्रोग्राम की फ़ाइलों के बायटेकोड-संकलित और अनुकूलित बायटेकोड-संकलित संस्करण हैं।

एक प्रोग्रामर के रूप में, आप काफी हद तक इसे अनदेखा कर सकते हैं ... यह सब आपके कार्यक्रम को थोड़ा तेज शुरू करता है। जब आपकी स्क्रिप्ट बदल जाती है, तो वे पुन: कनेक्ट हो जाएंगे, और यदि आप फ़ाइलों या संपूर्ण फ़ोल्डर को हटा देते हैं और अपना प्रोग्राम फिर से चलाते हैं, तो वे फिर से दिखाई देंगे (जब तक कि आप विशेष रूप से उस व्यवहार को दबा न दें)

यदि आप cpython का उपयोग कर रहे हैं (जो कि सबसे सामान्य है, जैसा कि यह संदर्भ कार्यान्वयन है) और आप उस फ़ोल्डर को नहीं चाहते हैं, तो आप उदाहरण के लिए -B ध्वज के साथ दुभाषिया शुरू करके इसे दबा सकते हैं

python -B foo.py

एक अन्य विकल्प, जैसा कि tcaswell ने नोट किया है, पर्यावरण चर PYTHONDONTWRITEBYTECODEको किसी भी मूल्य पर सेट करना है (अजगर के आदमी पृष्ठ के अनुसार, कोई भी "गैर-रिक्त स्ट्रिंग")।


48
आप PYTHONDONTWRITEBYTECODE=<any_value>इसे स्थायी रूप से दबाने के लिए पर्यावरण चर भी जोड़ सकते हैं ।
मार्क टॉलेनन

11
बस स्पष्ट करने के लिए, यह केवल पायथन 3 के लिए है, सही है?
जो जे

11
@JoeJ हाँ, मुझे लगता है कि यह सच है। python2यदि मैं गलत नहीं हूँ तो संकलित फ़ाइलों को मूल के समान निर्देशिका में रखता हूँ।
scott_fakename

27
एक महत्वपूर्ण चेतावनी यह है कि यदि .py फ़ाइल गायब है, तो .py फ़ाइल के बजाय कैश्ड .pyc फ़ाइल का उपयोग किया जाएगा। व्यवहार में, यह केवल तब होता है जब आप मॉड्यूल (या नाम बदलें) को हटाते हैं, इसलिए यह एक सामान्य घटना नहीं है, लेकिन यदि कुछ सामान आपके सिर को खरोंचने के बाद, "चल रहा है" रहता है, तो ढूंढते हैं। -नाम * .pyc | अपने स्रोत पर xargs rm शायद एक अच्छी पहली प्रतिक्रिया है।
yacc143

34
find . -name '*.pyc' -deleteहां, ढूंढी गई फ़ाइलों को हटाने के लिए एक ध्वज है, इसलिए आपको किसी भी xargs shananigans का उपयोग करने की आवश्यकता नहीं है
vlad-ardelean

174

__pycache__एक फ़ोल्डर है जिसमें पायथन 3 बाइटकोड संकलित है और निष्पादित होने के लिए तैयार है

मैं नियमित रूप से इन फ़ाइलों को हटाने या विकास के दौरान निर्माण को दबाने की सिफारिश नहीं करता हूं क्योंकि यह प्रदर्शन को चोट पहुंचा सकता है। बस एक पुनरावर्ती कमांड तैयार है (नीचे देखें) को साफ करने के लिए जब आवश्यकतानुसार बायटेकोड किनारे के मामलों में बासी हो सकता है (टिप्पणियां देखें)।

पायथन प्रोग्रामर आमतौर पर बायटेकोड को नजरअंदाज करते हैं। वास्तव में __pycache__और फ़ाइलों *.pycमें देखने के लिए आम लाइनें हैं .gitignore। बाइटकोड का अर्थ वितरण के लिए नहीं है और इसे disमॉड्यूल का उपयोग करके अलग किया जा सकता है ।


यदि आप OS X का उपयोग कर रहे हैं, तो आप अपने प्रोजेक्ट के रूट फ़ोल्डर से निम्न कमांड चलाकर इन सभी फ़ोल्डरों को आसानी से अपने प्रोजेक्ट में छिपा सकते हैं।

find . -name '__pycache__' -exec chflags hidden {} \;

पायथन 2 के __pycache__साथ बदलें *.pyc

यह उन सभी निर्देशिकाओं (.pyc फ़ाइलों) पर एक फ़्लैग सेट करता है जो फाइंडर / टेक्स्टमेट 2 को बताता है कि उन्हें लिस्टिंग से बाहर रखा जाए। महत्वपूर्ण रूप से बायटेकोड है, यह सिर्फ छिपा हुआ है।

यदि आप नए मॉड्यूल बनाते हैं और नए बायोटेक को छिपाने की इच्छा रखते हैं या यदि आप छिपे हुए बायटेककोड फ़ाइलों को हटाते हैं तो कमांड को फिर से चलाएँ।


विंडोज पर समतुल्य कमांड (परीक्षण स्क्रिप्ट का स्वागत नहीं) हो सकता है:

dir * /s/b | findstr __pycache__ | attrib +h +s +r

जो राइट-क्लिक> Hide ...


रनिंग यूनिट परीक्षण एक ऐसा परिदृश्य है (टिप्पणियों में अधिक) जहां *.pycफ़ाइलों और __pycache__फ़ोल्डरों को हटाना वास्तव में उपयोगी है। मैं अपने में निम्न पंक्तियों का उपयोग करता हूं ~/.bash_profileऔर बस clजरूरत पड़ने पर सफाई के लिए दौड़ता हूं ।

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

हर बार जब आप कोड चलाते हैं तो क्या यह पूर्ववत नहीं होगा?
होलायते

2
@DoTheEvo: यह आसानी से नहीं बनाया जाता है, इसलिए अगली बार मॉड्यूल लोड होने पर कोई स्पीडअप नहीं है। कोई त्रुटि नहीं है।
पेट्र विक्टोरिन

7
यह एक अच्छा जवाब नहीं है। पूछने वाला जानना चाहता है कि ये फाइलें किस लिए हैं। यह उत्तर कहता है "इसके बारे में चिंता न करें" और फिर उन्हें गायब कर देता है।
दिलचस्प है

36
इन्हें हटाने के लिए बिल्कुल परेशान करें : यह व्यर्थ नहीं है। पायथन ख़ुशी से फ़ाइल परिवर्तनों का पता नहीं लगाएगा और कई परिस्थितियों में कैश फ़ाइल को बंद कर देगा, आपको "क्यों च अभी भी काम नहीं करता है, के साथ दीवार को ऊपर उठाते हुए, मैंने कोड को बदल दिया, क्यों यह अभी भी बिना किसी कॉल के विफल हो रहा है" बकवास। विशेष रूप से परीक्षण रूपरेखाओं में, पाइका-बाय-डिफ़ॉल्ट सबसे खराब है।
माइक 'पोमैक्स' कमेरमन्स

2
मैं इस सलाह से असहमत हूं कि "इन फ़ाइलों को हटाने से परेशान न करें" - इसने कई बार सिफारिश की है, सबसे हाल ही में केनेथ रिट्ज की "हाउ टू पाइथन" ("बाइटेकोड ट्रिक")
लुई मैडॉक्स

38

__pycache__जब आप लाइन का उपयोग करते हैं तो एक फ़ोल्डर बनाया जाता है:

import file_name

या आपके द्वारा बनाई गई किसी अन्य फ़ाइल से जानकारी प्राप्त करने का प्रयास करें। दूसरी फ़ाइल खोलने के लिए दूसरी बार अपना प्रोग्राम चलाने पर यह थोड़ा तेज़ हो जाता है।


27

3.7+ डॉक्स से अपडेट किया गया उत्तर:

लोडिंग मॉड्यूल को गति देने के लिए, पायथन__pycache__ नाम के तहत निर्देशिका में प्रत्येक मॉड्यूल के संकलित संस्करण को कैश करता हैmodule.version.pyc , जहां संस्करण संकलित फ़ाइल के प्रारूप को एन्कोड करता है; इसमें आमतौर पर पायथन संस्करण संख्या शामिल होती है। उदाहरण के लिए, CPython रिलीज़ 3.3 में spam.py के संकलित संस्करण को कैश किया जाएगा __pycache__/spam.cpython-33.pyc। यह नामकरण सम्मेलन विभिन्न रिलीज और सह-अस्तित्व के विभिन्न संस्करणों से संकलित मॉड्यूल को संकलित करने की अनुमति देता है।

स्रोत: https://docs.python.org/3/tutorial/modules.html#compiled-python-files

यही है, यह निर्देशिका पायथन द्वारा बनाई गई है और आपके कार्यक्रमों को तेजी से चलाने के लिए मौजूद है। यह स्रोत नियंत्रण के लिए प्रतिबद्ध नहीं होना चाहिए, और आपके स्थानीय स्रोत कोड के साथ शांति में सह-अस्तित्व होना चाहिए।


__pycache__एक निर्देशिका है जिसमें बायटेकोड कैश फाइलें हैं जो स्वचालित रूप से अजगर द्वारा संकलित हैं, अर्थात् संकलित अजगर, या .pyc, फाइलें। आप सोच रहे होंगे कि पायथन, जो "व्याख्या" भाषा है, की कोई भी संकलित फाइल है। यह SO प्रश्न यह बताता है कि (और निश्चित रूप से यह उत्तर पढ़ने लायक है )।

अजगर डॉक्स अधिक गहराई में जाते हैं कि यह कैसे काम करता है और यह क्यों मौजूद है:

  • यह अजगर 3.2 में जोड़ा गया था क्योंकि एक .pycही निर्देशिका में फ़ाइलों को बनाए रखने की मौजूदा प्रणाली ने विभिन्न समस्याएं पैदा कीं, जैसे कि जब एक प्रोग्राम को विभिन्न संस्करणों के पायथन दुभाषियों के साथ चलाया गया था। पूर्ण सुविधा युक्ति के लिए, PEP 3174 देखें ।

5

आधिकारिक अजगर ट्यूटोरियल मॉड्यूल से

लोडिंग मॉड्यूल को गति देने के लिए, पायथन __pycache__नाम के तहत निर्देशिका में प्रत्येक मॉड्यूल के संकलित संस्करण को कैश करता है module.version.pyc, जहां संस्करण संकलित फ़ाइल के प्रारूप को एन्कोड करता है; इसमें आमतौर पर पायथन संस्करण संख्या शामिल होती है। उदाहरण के लिए, CPython रिलीज़ में 3.6 का संकलित संस्करण स्पैमहोम के रूप में कैश किया जाएगा __pycache__/spam.cpython-36.pyc

पायथन डॉक प्रोग्रामिंग एफएक्यू से

जब पहली बार एक मॉड्यूल आयात किया जाता है (या जब वर्तमान फ़ाइल संकलित फ़ाइल बनाने के बाद से स्रोत फ़ाइल बदल गई है) तो एक संकलित कोड युक्त पीपी फ़ाइल __pycache__को निर्देशिका के उपनिर्देशिका में .pyफ़ाइल के साथ बनाया जाना चाहिए । .pycफ़ाइल एक फ़ाइल नाम के रूप में एक ही नाम के साथ शुरू होता होगा .pyफ़ाइल समाप्त हो जाती है, और साथ .pycएक मध्यम घटक है कि विशेष रूप से अजगर द्विआधारी है कि यह बनाया पर निर्भर करता है के साथ,।


5

एक पायथन स्क्रिप्ट के निष्पादन के कारण बाइट कोड को मेमोरी में उत्पन्न किया जाएगा और कार्यक्रम बंद होने तक रखा जाएगा। यदि कोई मॉड्यूल आयात किया जाता है, तो तेजी से पुन: प्रयोज्य के लिए, पायथन कैश पैदा करेगा। पीपीसी (PYC 'पायथन' 'संकलित') फ़ाइल है जहां आयात किए जा रहे मॉड्यूल का बाइट कोड कैश किया गया है। आइडिया फिर से संकलित होने से बचने के लिए अजगर मॉड्यूल के लोडिंग को तेज करना है (एक बार संकलित करें, कई बार पॉलिसी चलाएं) जब वे फिर से आयात किए जाते हैं।

फ़ाइल का नाम मॉड्यूल नाम के समान है। प्रारंभिक डॉट के बाद का हिस्सा पायथन कार्यान्वयन को इंगित करता है जिसने कैश बनाया (CPython हो सकता है) इसके संस्करण संख्या के बाद।


3

अजगर दुभाषिया * .py स्क्रिप्ट फ़ाइल संकलित करता है और __pycache__निर्देशिका के संकलन के परिणामों को बचाता है ।

जब प्रोजेक्ट को फिर से निष्पादित किया जाता है, अगर दुभाषिया पहचानता है कि * __pycache__

जब प्रोजेक्ट जटिल होता है, तो आप प्रोजेक्ट को कम चलाने से पहले तैयारी का समय बना सकते हैं। यदि प्रोग्राम बहुत छोटा है, तो आप विकल्प के python -B abc.pyसाथ उपयोग करके इसे अनदेखा कर सकते हैं B


3

पायथन संस्करण 2.x में .pyc होगा जब दुभाषिया कोड को संकलित करता है।

पायथन संस्करण 3.x में __pycache__ होगा जब दुभाषिया कोड संकलित करता है।

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$

2

3.2 और बाद में, पायथन को एक निर्देशिका में उप-निर्देशिका में .pyc संकलित बाइट कोड फ़ाइलों को सहेजता है, __pycache__जहां आपकी स्रोत फाइलें उन फ़ाइलनामों के साथ रहती हैं जो पायथन संस्करण की पहचान करती हैं जो उन्हें बनाया था (जैसे script.cpython-33.pyc)


मैं "" के निर्माण से कैसे बच सकता हूँ pycache " फ़ोल्डर और सभी .pyc को .py फ़ाइल के रूप में नाम दिया जाना चाहिए।
अश्वनी

1

जब आप एक मॉड्यूल आयात करते हैं ,

import file_name

पायथन ने संकलित बाइटेकोड को __pycache__निर्देशिका में संग्रहीत किया है ताकि भविष्य के आयात इसे सीधे उपयोग कर सकें, बजाय स्रोत को पार्स और संकलित करने के।

ऐसा नहीं है कि केवल एक स्क्रिप्ट चलाने के लिए, केवल जब एक फ़ाइल आयात किया जाता है।

(पिछले संस्करणों में कैशे बाईटेककोड को .pyc फ़ाइलों के रूप में संग्रहीत किया जाता था जो कि .py फ़ाइलों के समान निर्देशिका को लिट कर देते थे, लेकिन पायथन 3 में शुरू करके उन्हें चीजों को स्तरीय बनाने के लिए एक उपनिर्देशिका में ले जाया गया।)

PYTHONDONTWRITEBYTECODE ---> यदि यह एक गैर-रिक्त स्ट्रिंग पर सेट है, तो पायथन सोर्स मॉड्यूल के आयात पर .pyc फाइलें लिखने का प्रयास नहीं करेगा। यह -B विकल्प को निर्दिष्ट करने के बराबर है।

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