यदि पायथन की व्याख्या की जाती है, तो .pyc फाइलें क्या हैं?


1083

मुझे यह समझने के लिए दिया गया है कि पायथन एक व्याख्या की गई भाषा है ...
हालांकि, जब मैं अपने पायथन स्रोत कोड को देखता हूं तो मुझे .pycफाइलें दिखाई देती हैं , जिसे विंडोज "संकलित अजगर फाइलें" के रूप में पहचानता है।

ये कहां आते हैं?


3
एक औचित्य के लिए देखें stackoverflow.com/questions/11433579/… । एक शब्द में: गति।
user7610



क्या इसका मतलब यह भी है कि अजगर के पास यह है कि 'एक बार लिखें, कहीं भी दौड़ें' सिर्फ जावा की तरह?
म्रक व्लाडर

2
@MrakVladar इवन जावा है "एक बार लिखो, कहीं भी चलाओ [कि तुम्हारे पास एक JVM है]"। अजगर अलग नहीं है; यह "कहीं भी आपके पास एक पायथन वर्चुअल मशीन है" चलाएं। बड़ा अंतर यह है कि अधिकांश पायथन कार्यान्वयन संकलक और दुभाषिया को एक निष्पादन योग्य में जोड़ते हैं, बजाय उन्हें अलग करने के javaऔर javac
चेपनर

जवाबों:


660

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

पायथन के प्रलेखन की परिभाषा इस तरह है:

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


10
दिलचस्प है, धन्यवाद। तो क्या पायथन को विशुद्ध रूप से व्याख्या की गई भाषा माना जाता है?
फ्रेंडी

194
@ फ्रोडी: एक भाषा "व्याख्या" या "संकलित" नहीं है। एक विशिष्ट कार्यान्वयन एक दुभाषिया या एक कंपाइलर (या एक हाइब्रिड या एक जेआईटी कंपाइलर) हो सकता है।
जोचिम सॉर

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

20
पांडित्य होने के लिए, 'संकलित' का अर्थ है 'अनुवादित'। पाइथन को फिर एक बाईटेकोड में संकलित किया जाता है। AFAIK, केवल बैश वास्तव में व्याख्या की गई है, अन्य सभी लोकप्रिय "व्याख्या की गई" भाषाएं सभी एक बाइटकोड के लिए संकलित हैं।
bfontaine

13
वास्तव में, वे कर रहे हैं मशीन निर्देश, बस नहीं देशी मेजबान की शारीरिक सीपीयू के लिए मशीन निर्देश। इसलिए हम इसे वीएम क्यों कहते हैं? असेंबली लैंग्वेज के लिए जैसे कि एस्पेरांतो। आजकल हमारे पास काल्पनिक (लेकिन अभी भी अनुकरण किए गए) सीपीयू के लिए देशी कोड (मोहांग का प्रयास किडनी पाने के लिए इच्छुक) है। Rexx वास्तव में व्याख्या की गई (या हो सकती है), और BAT और CMD (और DCL) की व्याख्या की जाती है।
mckenzm

994

मुझे यह समझने के लिए दिया गया है कि पायथन एक व्याख्या की गई भाषा है ...

यह लोकप्रिय मेम गलत है, या, बल्कि, (प्राकृतिक) भाषा के स्तर की गलतफहमी पर बनाई गई है: एक ऐसी ही गलती "बाइबिल एक हार्डकवर किताब है" कहना होगा। मुझे समझाएं कि उपमा ...

"द बाइबल" किताबों के वर्ग (वास्तविक, भौतिक वस्तुओं के रूप में पहचानी जाने वाली) के अर्थ में "एक पुस्तक" है ; "बाइबल की प्रतियों" के रूप में पहचानी जाने वाली पुस्तकों में सामान्य रूप से कुछ मौलिक होने की संभावना है (सामग्री, हालांकि वे भी अलग-अलग भाषाओं में हो सकती हैं, विभिन्न स्वीकार्य अनुवादों के साथ, फुटनोट्स के स्तर और अन्य एनोटेशन) - हालांकि, वे पुस्तकें हैं पूरी तरह से अच्छी तरह से उन पहलुओं के असंख्य में अंतर करने की अनुमति दी जाती है जिन्हें मौलिक नहीं माना जाता है - छपाई में उपयोग किए जाने वाले बंधन, बंधन का रंग, फ़ॉन्ट (ओं) का उपयोग किया जाता है, चित्रण यदि कोई हो, विस्तृत लेखन योग्य मार्जिन या नहीं, संख्या और प्रकार के अंतर्निहित बुकमार्क , इत्यादि इत्यादि।

यह बहुत संभव है कि बाइबल का एक विशिष्ट मुद्रण वास्तव में हार्डकवर बाइंडिंग में होगा - आखिरकार, यह एक ऐसी किताब है जिसे आम तौर पर बार-बार पढ़ने के लिए माना जाता है, जिसे कई स्थानों पर बुकमार्क किया गया है, जो दिए गए अध्याय और कविता बिंदुओं की तलाश में है। , आदि, और एक अच्छा हार्डकवर बंधन इस तरह के उपयोग के तहत एक दी गई प्रतिलिपि को लंबे समय तक बना सकता है। हालाँकि, ये सांसारिक (व्यावहारिक) मुद्दे हैं जिनका उपयोग यह निर्धारित करने के लिए नहीं किया जा सकता है कि दी गई वास्तविक पुस्तक वस्तु बाइबल की एक प्रति है या नहीं: पेपरबैक मुद्रण पूरी तरह से संभव है!

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

शास्त्रीय कार्यान्वयन, CPython, को अक्सर लघु के लिए "Python" कहा जाता है - लेकिन यह कई उत्पादन-गुणवत्ता कार्यान्वयनों में से एक है, जो Microsoft के IronPython के साथ कंधे से कंधा मिलाकर चलता है (जो CLR कोडों को संकलित करता है, अर्थात ".NET .NET), Jython (जो JVM कोड के लिए संकलित करता है), PyPy (जो स्वयं Python में लिखा गया है और "जस्ट-इन-टाइम" जेनरेट की गई मशीन लैंग्वेज सहित "बैक-एंड" रूपों की एक विशाल विविधता के लिए संकलन कर सकता है)। वे सभी पायथन (== "पायथन भाषा के कार्यान्वयन" हैं) ठीक उसी तरह जैसे कई सतही अलग-अलग पुस्तक ऑब्जेक्ट्स सभी बाइबल्स (== "बाइबिल की प्रतियां") हो सकते हैं।

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

इन निचले स्तर के रूपों को तब उपयुक्त "आभासी मशीनों" द्वारा निष्पादित किया जाता है, जिन्हें "दुभाषियों" के रूप में भी जाना जाता है - सीपीथॉन वीएम, .नेट रनटाइम, जावा वीएम (उर्फ जेवीएम), उपयुक्त के रूप में।

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

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


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

1
@ एलज़ार, वास्तव में, पायथन के अन्य कार्यान्वयन, जैसे कि PyPy, जो संकलन करने की जल्दी में नहीं हैं, स्थैतिक टाइपिंग की कमी के लिए आवश्यक अधिक गहन विश्लेषण करने का प्रबंधन करते हैं और मशीन कोड के लिए बस-इन-टाइम संकलन का उत्पादन करते हैं (इस प्रकार तेजी से कई बार लंबे समय तक चलने वाले कार्यक्रम)।
एलेक्स मार्टेली

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

181

व्याख्यात्मक भाषा जैसी कोई चीज नहीं है। एक दुभाषिया या एक कंपाइलर का उपयोग किया जाता है या नहीं, यह पूरी तरह से कार्यान्वयन का एक गुण है और भाषा के साथ इसका कोई लेना-देना नहीं है।

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

एक भाषा अमूर्त गणितीय नियमों का एक सेट है। एक दुभाषिया भाषा के लिए कई ठोस कार्यान्वयन रणनीतियों में से एक है। वे दो पूरी तरह से अलग अमूर्त स्तरों पर रहते हैं। यदि अंग्रेजी एक टाइप की गई भाषा थी, तो "व्याख्या की गई भाषा" शब्द एक प्रकार की त्रुटि होगी। "पायथन एक व्याख्या की गई भाषा है" यह कथन केवल असत्य नहीं है (क्योंकि असत्य होने का अर्थ यह होगा कि यह कथन समझ में भी आता है, भले ही यह गलत हो), यह केवल स्पष्ट नहीं है , क्योंकि एक भाषा को कभी भी परिभाषित नहीं किया जा सकता है "की व्याख्या की।"

विशेष रूप से, यदि आप वर्तमान में विद्यमान पायथन कार्यान्वयन को देखते हैं, तो वे कार्यान्वयन रणनीतियाँ हैं जिनका वे उपयोग कर रहे हैं:

  • आयरनपाइथन: डीएलआर पेड़ों का संकलन करता है, जो डीएलआर फिर सीआईएल बायटेकोड को संकलित करता है। CIL बायटेकोड का क्या होता है यह इस बात पर निर्भर करता है कि आप किस CLI VES पर चल रहे हैं, लेकिन Microsoft .NET, GNU पोर्टेबल .नेट और नोवेल मोनो इसे अंततः देशी मशीन कोड में संकलित करेंगे।
  • Jython: Python sourcecode की व्याख्या तब तक करता है जब तक कि यह हॉट कोड पाथ की पहचान नहीं कर लेता है, जो इसके बाद JVML बायोटेक को संकलित करता है। जेवीएमएल बायटेकोड के साथ क्या होता है यह इस बात पर निर्भर करता है कि आप किस जेवीएम पर चल रहे हैं। Maxine सीधे इसे अन-ऑप्टिमाइज़ किए गए देशी कोड के लिए संकलित करेगा, जब तक कि यह हॉट कोड पाथ की पहचान न कर ले, जो कि इसके बाद अनुकूलित कोड को रीकोड करता है। हॉटस्पॉट पहले जेवीएमएल बायोटेक की व्याख्या करेगा और फिर अंत में अनुकूलित मशीन कोड के लिए हॉट कोड पथ संकलित करेगा।
  • PyPy: PyPy bytecode को संकलित करता है, जिसकी व्याख्या PyPy VM द्वारा तब तक की जाती है, जब तक कि यह हॉट कोड पाथ की पहचान नहीं कर लेता है, जो इसके बाद मूल कोड, JVML बायोटेक या CIL बायोटेक में संकलित करता है, जिसके आधार पर आप किस प्लेटफॉर्म पर चल रहे हैं।
  • CPython: CPython bytecode को संकलित करता है जो तब इसकी व्याख्या करता है।
  • स्टैकलेस पायथन: CPython bytecode को संकलित करता है, जो तब इसकी व्याख्या करता है।
  • Unladen Swallow: CPython bytecode को संकलित करता है जो तब तक इसकी व्याख्या करता है जब तक कि यह हॉट कोड पाथ की पहचान नहीं कर लेता है जो कि इसके बाद LLVM IR को संकलित करता है जिसे LLVM कंपाइलर फिर देशी मशीन कोड के लिए संकलित करता है।
  • साइथन: पायथन कोड को पोर्टेबल सी कोड में संकलित करता है, जिसे बाद में एक मानक सी कंपाइलर के साथ संकलित किया जाता है
  • Nuitka: Python कोड को मशीन पर निर्भर C ++ कोड के लिए संकलित करता है, जिसे बाद में एक मानक C संकलक के साथ संकलित किया जाता है

आप देख सकते हैं कि उस सूची में क्रियान्वयन के हर एक (साथ ही कुछ अन्य जिनका मैंने उल्लेख नहीं किया था, जैसे टिनिपी, शेड्स्किन या साइको) का एक कंपाइलर है। वास्तव में, जहां तक ​​मुझे पता है, वर्तमान में कोई पायथन कार्यान्वयन नहीं है, जिसकी विशुद्ध रूप से व्याख्या की जाती है, तो ऐसा कोई कार्यान्वयन योजना नहीं है और इस तरह का कार्यान्वयन कभी नहीं हुआ है।

न केवल "व्याख्या की गई भाषा" शब्द का कोई मतलब नहीं है, भले ही आप इसे "व्याख्या किए गए कार्यान्वयन के साथ भाषा" के रूप में अर्थ दें, यह स्पष्ट रूप से सच नहीं है। जिसने भी आपको बताया है, जाहिर है वह नहीं जानता कि वह किस बारे में बात कर रहा है।

विशेष रूप से, जिन .pycफ़ाइलों को आप देख रहे हैं, वे CPython, Stackless Python या Unladen Swallow द्वारा निर्मित कैशे बाइटकोड फ़ाइलें हैं।


5
पुराने स्कूल बुनियादी जैसे कि MSBASIC का कोई मध्यवर्ती रूप नहीं था। कार्यक्रम की व्याख्या सीधे स्रोत फॉर्म (या निकट स्रोत, एक ऐसे रूप में की गई थी जिसमें कीवर्ड 1-बाइट टोकन द्वारा दर्शाए गए थे, और 2-बाइट बाइनरी इन्ट्स द्वारा लाइन #, लेकिन बाकी सिर्फ ASCII था)। इसलिए वास्तव में एक 'गोटो' के लिए अलग-अलग समय लगेगा, जो इस बात पर निर्भर करता है कि उसे मिलान गंतव्य की तलाश में कितनी स्रोत रेखाओं की खोज करनी थी। हर बार निष्पादित होने पर एक * b-2 * cos (x) जैसी अभिव्यक्तियों को प्रभावी ढंग से पुन: पार्स किया गया।
greggo

4
@greggo: और यदि आप और भी पुराने स्कूल जाना चाहते हैं, तो BASIC का मूल संस्करण एक देशी कोड कंपाइलर था। यह साबित करना चाहिए कि "संकलित" या "व्याख्या" भाषा की धारणा कितनी हास्यास्पद है।
जोर्ग डब्ल्यू मित्तग

यह समझाने के लिए धन्यवाद कि विभिन्न अजगर संकलक / व्याख्याकार कैसे व्यवहार करते हैं। मुझे आश्चर्य है कि अगर अच्छे सी पायथन संकलक हैं जो अभी तक कुशल सी या जावास्क्रिप्ट उत्पन्न करते हैं। यह बहुत ही उचित लगता है, शायद बड़े पैमाने पर खपत के लिए नहीं, लेकिन कम से कम पायथन के उचित उपसमुच्चय के लिए। इसके अलावा, मुझे आश्चर्य है कि साइथन क्या है।
व्यक्तिगत_क्लाउड

साइपॉन का उल्लेख SciPy 2009 में किया गया था, लेकिन मैं आपको इसके बारे में 2010 में वापस न जानने के लिए क्षमा कर सकता हूं (यहां मैं 2017 में अभी केवल इसके बारे में सीख रहा हूं)। फिर भी हमें एक जावास्क्रिप्ट उदाहरण खोजने की जरूरत है ... जेथोन को इससे कोई मतलब नहीं है (2009 तक जावा पहले से ही मृत नहीं था! अच्छा हम्म, शायद नहीं ... सी ++ बूस्ट वापस इतना अच्छा नहीं था)
personal_cloud

1
@personal_cloud: मैं आपकी टिप्पणी का पालन नहीं करता। हां, निश्चित रूप से, मैं साइथन के बारे में जानता हूं, लेकिन इसका किसी भी चीज से क्या लेना-देना है? यह पायथन का कार्यान्वयन नहीं है, यह पूरी तरह से अलग भाषा है। इसके अलावा, वास्तव में एक जावास्क्रिप्ट उदाहरण खोजना मुश्किल नहीं है, वास्तव में, वर्तमान में सभी मौजूदा मुख्यधारा जावास्क्रिप्ट कार्यान्वयन में संकलक हैं। अंत में, अजगर अजगर के किसी भी अन्य कार्यान्वयन की तरह ही पायथन का कार्यान्वयन है। और यह जावा प्लेटफॉर्म पर किसी अन्य भाषा के कार्यान्वयन की तरह जावा प्लेटफॉर्म पर एक भाषा का कार्यान्वयन है।
जोर्ग डब्ल्यू मित्तग

61

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


10
सच। कई कोर पायथन पुस्तकालयों को छोड़कर सी में लिखे गए हैं। इसलिए पायथन के कुछ हिस्सों की व्याख्या की गई है, सी में भाग भाग आप अपने स्वयं के प्रदर्शन संवेदनशील कोड के समान ही कर सकते हैं।
बावनोक

44

लोडिंग मॉड्यूल को गति देने के लिए, पायथन मॉड्यूल के संकलित सामग्री को .pyc में कैश करता है।

CPython अपने स्रोत कोड को "बाइट कोड" में संकलित करता है, और प्रदर्शन कारणों से, यह फ़ाइल सिस्टम पर इस बाइट कोड को कैश करता है जब भी स्रोत फ़ाइल में परिवर्तन होता है। यह पायथन मॉड्यूल को अधिक तेजी से लोड करता है क्योंकि संकलन चरण को बायपास किया जा सकता है। जब आपकी स्रोत फ़ाइल foo.py है, तो CPython स्रोत के ठीक बगल में foo.pyc फ़ाइल में बाइट कोड को कैश करता है।

Python3 में, पायथन की आयात मशीनरी को प्रत्येक पायथन पैकेज निर्देशिका के अंदर एकल निर्देशिका में बाइट कोड कैश फ़ाइलों को लिखने और खोजने के लिए बढ़ाया जाता है। इस निर्देशिका को __pycache__ कहा जाएगा।

यहाँ एक फ्लो चार्ट बताया गया है कि मॉड्यूल कैसे लोड होते हैं:

यहां छवि विवरण दर्ज करें

अधिक जानकारी के लिए:

रेफरी: PEP3147
रेफरी: "संकलित" पायथन फाइलें


38

BEGINNERS के लिए यह है,

पायथन स्वचालित रूप से संकलित कोड के लिए आपकी स्क्रिप्ट को संकलित करता है, इसलिए इसे चलाने से पहले बाइट कोड कहा जाता है।

स्क्रिप्ट चलाना आयात नहीं माना जाता है और न ही .pyc बनाया जाएगा।

उदाहरण के लिए, यदि आपके पास एक स्क्रिप्ट फ़ाइल abc.py है जो किसी अन्य मॉड्यूल xyz.py को आयात करती है , जब आप abc.py चलाते हैं , xyz.pyc xyz आयात होने के बाद बनाया जाएगा, लेकिन कोई abc.pyc फ़ाइल नहीं बनाई जाएगी बाद abc बाद से । पाई आयात नहीं की जा रही है।

यदि आपको एक मॉड्यूल के लिए एक .pyc फ़ाइल बनाने की आवश्यकता है जो आयात नहीं की जाती है, तो आप इसका उपयोग कर सकते हैं py_compileऔरcompileall मॉड्यूल का ।

py_compileमॉड्यूल मैन्युअल किसी भी मॉड्यूल संकलन कर सकते हैं। एक तरीका यह है py_compile.compileकि उस मॉड्यूल में फंक्शनल का उपयोग करें :

>>> import py_compile
>>> py_compile.compile('abc.py')

यह .pyc को उसी स्थान पर लिखेगा जैसे abc.py (आप इसे वैकल्पिक पैरामीटर के साथ ओवरराइड कर सकते हैं) cfile )।

आप कंपाइलल मॉड्यूल का उपयोग करके किसी निर्देशिका या निर्देशिका में सभी फ़ाइलों को स्वचालित रूप से संकलित कर सकते हैं।

python -m compileall

यदि निर्देशिका नाम (इस उदाहरण में वर्तमान निर्देशिका) को छोड़ दिया जाता है, तो मॉड्यूल सब कुछ मिला पर संकलित करता है sys.path


6
और abc.py पाने के लिए संकलन करने का क्या लाभ है?
साहेर अहवाल

@SaherAhwal एक लाभ यह है कि मैं सिंटैक्स जाँच के बारे में सोच सकता हूँ।
यी बाओ

20

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

हालांकि, इसका दूसरा पक्ष यह है कि संकलन प्रक्रिया ज्यादातर छिपी हुई है - .pyc फाइलें मूल रूप से कैश की तरह व्यवहार की जाती हैं; वे चीजों को गति देते हैं, लेकिन आपको आम तौर पर उनके बारे में जागरूक होने की आवश्यकता नहीं है। फ़ाइल समय / दिनांक टिकटों के आधार पर आवश्यक होने पर यह स्वचालित रूप से उन्हें अमान्य कर देता है और उन्हें पुनः लोड करता है (स्रोत कोड को पुन: संकलित करता है)।

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


12

पायथन की * .py फ़ाइल सिर्फ एक पाठ फ़ाइल है जिसमें आप कोड की कुछ पंक्तियाँ लिखते हैं। जब आप "python filename.py" का उपयोग करके इस फ़ाइल को निष्पादित करने का प्रयास करते हैं

यह आदेश पायथन वर्चुअल मशीन को आमंत्रित करता है। पायथन वर्चुअल मशीन में 2 घटक होते हैं: "संकलक" और "दुभाषिया"। दुभाषिया सीधे * .py फ़ाइल में पाठ नहीं पढ़ सकता है, इसलिए यह पाठ पहले एक बाइट कोड में परिवर्तित हो जाता है जिसे पीवीएम (हार्डवेयर नहीं बल्कि पीवीएम) पर लक्षित किया जाता है । PVM इस बाइट कोड को निष्पादित करता है। * .पाइक फाइल भी जेनरेट होती है, इसे चलाने के हिस्से के रूप में जो शेल में या किसी अन्य फाइल में आपके इंपोर्ट ऑपरेशन को करती है।

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

एक बार * .pyc फ़ाइल उत्पन्न होने के बाद, * .py फ़ाइल की कोई आवश्यकता नहीं है, जब तक आप इसे संपादित नहीं करते।


7

पायथन कोड 2 चरणों से गुजरता है। पहला चरण कोड को .pyc फाइलों में संकलित करता है जो वास्तव में एक बायटेकोड है। फिर इस .pyc फ़ाइल (बाइटकोड) की व्याख्या CPython दुभाषिया के उपयोग से की जाती है। कृपया इस लिंक को देखें । यहां कोड संकलन और निष्पादन की प्रक्रिया को आसान शब्दों में समझाया गया है।

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