.Pyc फाइलें कब रीफ्रेश की जाती हैं?


91

मैं समझता हूं कि ".पाइक" फाइलें सादा-पाठ ".py" फाइलों के संकलित संस्करण हैं, जो तेजी से रन बनाने के लिए रनटाइम पर बनाई गई हैं। हालाँकि मैंने कुछ चीजें देखी हैं:

  1. "Py" फ़ाइलों के संशोधन पर, प्रोग्राम का व्यवहार बदल जाता है। यह इंगित करता है कि "py" फाइलें संकलित की जाती हैं या कम से कम जाती हैं हालांकि किसी प्रकार की हैशिंग प्रक्रिया या समय टिकटों की तुलना करने के लिए यह बताने के लिए कि उन्हें फिर से संकलित किया जाना चाहिए या नहीं।
  2. सभी ".pyc" फ़ाइलों को हटाने पर ( rm *.pyc) कभी-कभी प्रोग्राम व्यवहार बदल जाएगा। जो यह दर्शाता है कि उन्हें ".py" s के अद्यतन पर संकलित नहीं किया जा रहा है।

प्रशन:

  • वे कैसे तय करते हैं कि कब संकलित किया जाए?
  • क्या यह सुनिश्चित करने का एक तरीका है कि विकास के दौरान उनकी कड़ी जाँच हो?

14
.Pyc फ़ाइलों को हटाने से सावधान रहें rm *.pyc। यह नेस्टेड फ़ोल्डरों में .pyc फाइल्स को डिलीट नहीं करेगा। find . -name '*.pyc' -deleteइसके बजाय का उपयोग करें
Zags

6
आपके प्रश्न पर शायद एक नोट: एक प्रोग्राम तब तेजी से नहीं चलता है जब उसे '। Pyc' या '.pyo' फ़ाइल से पढ़ा जाता है, जब वह '.py' फ़ाइल से पढ़ा जाता है; एकमात्र चीज़ जो '.pyc' या '.pyo' फ़ाइलों के बारे में तेज़ है, वह गति है जिसके साथ वे लोड किए गए हैं। लिंक
मैगी

@ मैगी लोडिंग और निष्पादन समय के बीच क्या अंतर है?
डैनियल स्प्रिंगर

3
@ डैनी लोडिंग वह समय है जिसे पढ़ने और फिर प्रोग्राम को संकलित करने में समय लगता है। निष्पादन समय वह है जब प्रोग्राम वास्तव में चलाया जा रहा है जो लोडिंग के बाद होता है। यदि आप तकनीकी होना चाहते हैं, तो समय प्रकार लोड समय, संकलन समय, लिंक समय और निष्पादन समय हैं। -पाइक बनाने से कंपाइल टाइम पार्ट खत्म हो जाता है।
एरिक क्लियन

@EricKlien धन्यवाद आदमी
डैनियल स्प्रिंगर

जवाबों:


78

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

"कड़ी जाँच" से आपका क्या अभिप्राय है?


3
मैं समस्याओं को ठीक करने में सक्षम हूं rm *.pyc। मुझे पता है कि अगर मैं सभी फाइलों को फिर से बनाने के लिए मजबूर करता हूं तो कुछ मुद्दों को तय किया जाता है, यह दर्शाता है कि फाइलें खुद के लिए फिर से संकलित नहीं की जा रही हैं। मुझे लगता है कि अगर वे टाइमस्टैम्प का उपयोग करते हैं तो इस व्यवहार को कठोर बनाने का कोई तरीका नहीं है, लेकिन समस्या अभी भी बनी हुई है।
हारून शिफ

13
यह काफी सही नहीं है। टाइमस्टैम्प को मिलान करने की आवश्यकता नहीं है (और वे आमतौर पर नहीं करते हैं)। .pycके टाइमस्टैम्प होना चाहिए पुराने इसी से .pyएक रखता गति प्रदान करने के रों टाइमस्टैम्प '।
टिम पीटरज़ॉ

4
@Aaron, क्या आप संभवत: .py फाइलें बदल रहे हैं, और इस प्रक्रिया में उन्हें अधिक पुराना बना देते हैं (जैसे कि उन्हें किसी अन्य डीआईआर से कॉपी करके, एक ऑपरेशन का उपयोग करके जो 'संशोधन समय' को संरक्षित करता है)?
18

1
@ समूहगो, मैं गिट का उपयोग कर रहा हूं और भंडार से अपडेट कर रहा हूं, इसलिए हां एक तरह से मैं हूं। यह कर सकता है। धन्यवाद।
एरोन शिफ

1
जानकार अच्छा लगा। कैसे अपने जवाब को सही करने के बारे में?
पिओटर डोब्रोगोस्ट

29

जब भी संबंधित कोड तत्वों को आयात किया जाता है, तो .pyc फाइलें उत्पन्न होती हैं और यदि संबंधित कोड फाइलें अपडेट की गई हैं, तो वे अपडेट की जाती हैं। यदि .pyc फ़ाइलें हटा दी जाती हैं, तो वे स्वचालित रूप से पुनर्जीवित हो जाएंगे। हालाँकि, संबंधित कोड फ़ाइलों को हटाए जाने पर वे स्वचालित रूप से हटाए नहीं जाते हैं।

यह फ़ाइल-स्तर रिफ्लेक्टर के दौरान कुछ बहुत मजेदार कीड़े पैदा कर सकता है।

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

यदि आप पैकेज को मॉड्यूल में बदलते हैं तो दूसरा, आपके पास कुछ बहुत ही भयानक कीड़े हो सकते हैं। जब आप किसी पैकेज ( __init__.pyफ़ाइल के साथ एक फ़ोल्डर ) को एक मॉड्यूल (.py फ़ाइल) में परिवर्तित करते हैं, तो .pyc फ़ाइलें जो एक बार प्रतिनिधित्व करती हैं, वह पैकेज बनी रहती हैं। विशेष रूप से, __init__.pycअवशेष। इसलिए, यदि आपके पास कुछ कोड के साथ पैकेज फ़ू है, जो मायने नहीं रखता है, तो बाद में उस पैकेज को हटा दें और कुछ फ़ंक्शन def bar(): passऔर रन के साथ एक फ़ाइल foo.py बनाएं :

from foo import bar

आपको मिला:

ImportError: cannot import name bar

क्योंकि अजगर अभी भी foo पैकेज से पुरानी .pyc फ़ाइलों का उपयोग कर रहा है, जिनमें से कोई भी बार को परिभाषित नहीं करता है। यह एक वेब सर्वर पर विशेष रूप से समस्याग्रस्त हो सकता है, जहां .pyc फ़ाइलों के कारण पूरी तरह से कार्य कोड टूट सकता है।

इन दोनों कारणों (और संभवतः अन्य) के परिणामस्वरूप, आपके परिनियोजन कोड और परीक्षण कोड को .pyc फ़ाइलों को नष्ट करना चाहिए, जैसे कि bash की निम्न पंक्ति के साथ:

find . -name '*.pyc' -delete

इसके अलावा, अजगर 2.6 के रूप में, आप -B.pyc फ़ाइलों का उपयोग नहीं करने के लिए ध्वज के साथ अजगर चला सकते हैं । देखें कि कैसे बचें। पीसी फाइलें? अधिक जानकारी के लिए।

यह भी देखें: मैं किसी परियोजना से सभी .pyc फाइलें कैसे निकालूं?


"जब आप एक मॉड्यूल (एक __init__.pyफ़ाइल के साथ एक फ़ोल्डर ) में कनवर्ट करते हैं ..."। यह एक पैकेज होगा, एक मॉड्यूल नहीं।
राबर्ट डेविड ग्रांट

2
विशेष रूप से, __init__.pycअवशेष। - कैसे? एक पैकेज के रूप में एक निर्देशिका को हटाने के लिए एक पैकेज को हटाने का मतलब है कि निर्देशिका को हटाना इस प्रकार कोई फाइलें नहीं बची हैं ...
पिओट्र डॉब्रोगोस्ट

3
@PiotrDobrogost ठीक से प्रबंधित स्रोत नियंत्रण में स्रोत में आपकी pyc फ़ाइलों की जाँच नहीं करना शामिल है। इसलिए जब आप अपने स्थानीय कॉपी में pyc फ़ाइलों सहित फ़ोल्डर को हटा सकते हैं, तो यह किसी और के लिए नहीं हटाया जाएगा जो गिट पुल करता है। यह आपके सर्वर को क्रैश कर सकता है यदि आपकी तैनाती में गिट पुल भी शामिल हो।
ज़ैगस

अपने देव वातावरण पर भरोसा नहीं करने के कई कारण हैं जहां आपका कोड तैनात किया जाएगा। यह .pycसमस्या एक कारण है, यह भी: ओएस और उपयोगिता पैच के स्तर पर छिपी निर्भरता, .soफाइलें, कॉन्फिग फाइलें, अन्य पायथन लिबास (यदि आप वर्चुअल एनवी में नहीं चल रहे हैं), अस्पष्ट एनवी वेरिएस ... सूची चलती है। पूरी तरह से और इस तरह के सभी मुद्दों को खोजने के लिए, आपको एक git रेपो में अपने कोड की एक स्वच्छ प्रतिलिपि बनाने या PyPi शैली सर्वर पर एक पैकेज के रूप में प्रकाशित करने की आवश्यकता है, और एक ताजा VM पर एक पूर्ण क्लोन या सेटअप करें। उन संभावित समस्याओं में से कुछ इस .pycमुद्दे को तुलना में हल्का बनाती हैं।
क्रिस जॉनसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.