पायथन एक इंटरप्रेटर-आधारित भाषा है। हालाँकि, जब कोई स्क्रिप्ट (.py एक्सटेंशन वाली) चलाई जाती है, तो यह आंतरिक रूप से सोर्स कोड को बाइटकोड में कंपाइल करती है और बाद में बाइटकोड संस्करण को स्वचालित रूप से हटा दिया जाता है। जब किसी मॉड्यूल (प्रीकंपाइल्ड बिल्ट-इन मॉड्यूल के अलावा) को पहली बार इम्पोर्ट किया जाता है, तो उसका कंपाइल्ड संस्करण भी स्वचालित रूप से बनाया जाता है लेकिन __pycache__ फ़ोल्डर में .pyc एक्सटेंशन के साथ सेव किया जाता है। उसी मॉड्यूल को फिर से इम्पोर्ट करने पर यह दोबारा कंपाइल नहीं होता बल्कि पहले से बने बाइटकोड का उपयोग करता है।
पायथन स्क्रिप्ट को स्पष्ट रूप से कंपाइल करना
हालाँकि, .py एक्सटेंशन वाली पायथन स्क्रिप्ट फ़ाइल को चलाए बिना स्पष्ट रूप से कंपाइल किया जा सकता है। 'py_compile' मॉड्यूल में इस उद्देश्य के लिए 'compile()' फ़ंक्शन होता है। परिणामी .pyc फ़ाइल के नाम में पायथन का संस्करण संख्या जुड़ा होता है। पायथन 3.7 के मामले में, नाम में 'cpython-37' सफ़िक्स होता है।
आम तौर पर आपको इस मॉड्यूल की आवश्यकता नहीं होगी। हालाँकि, यह शेयर्ड उपयोग के लिए मॉड्यूल इंस्टॉल करते समय उपयोगी हो सकता है, खासकर यदि कुछ उपयोगकर्ताओं के पास सोर्स कोड वाली डायरेक्टरी में बाइटकोड कैश फ़ाइलें लिखने की अनुमति नहीं है।
कमांड लाइन इंटरफ़ेस
इस मॉड्यूल का एक कमांड लाइन इंटरफ़ेस है। इसे -m स्विच का उपयोग करके इम्पोर्ट किया जा सकता है:
E:\python37>python -m py_compile hello.py
यह __pycache__ सबफ़ोल्डर में 'hello.cpython-37.pyc' फ़ाइल बनाएगा और स्टोर करेगा।
प्रोग्रामेटिक बाइट-कंपाइलेशन
बाइट-कंपाइलेशन को py_compile मॉड्यूल में compile() फ़ंक्शन का उपयोग करके प्रोग्रामेटिक रूप से भी किया जा सकता है:
import py_compile
py_compile.compile("hello.py")
.pyc फ़ाइल को सीधे 실행 करना
.pyc एक्सटेंशन वाली बाइटकोड फ़ाइल को कमांड लाइन से सामान्य .py एक्सटेंशन वाली स्क्रिप्ट की तरह सीधे चलाया जा सकता है:
E:\python37>python __pycache__/hello.cpython-37.pyc
हालाँकि, इसे उसी संस्करण के इंटरप्रेटर द्वारा चलाया जा सकता है जिससे बाइटकोड फ़ाइल कंपाइल की गई थी। यदि हम इसे पायथन के किसी अन्य संस्करण के साथ चलाने का प्रयास करते हैं तो निम्न त्रुटि प्रदर्शित होगी:
C:\python36>python e:hello.cpython-37.pyc RuntimeError: Bad magic number in .pyc file
एकाधिक फ़ाइलों को कंपाइल करना
py_compile मॉड्यूल में एक और फ़ंक्शन main() होता है जो कई सोर्स फ़ाइलों को कंपाइल करता है। तर्क के रूप में नामित फ़ाइलों को कंपाइल किया जाता है और परिणामी बाइटकोड को सामान्य तरीके से कैश किया जाता है। यह फ़ंक्शन सोर्स फ़ाइलों का पता लगाने के लिए डायरेक्ट्री संरचना को खोजता नहीं है; यह केवल स्पष्ट रूप से नामित फ़ाइलों को कंपाइल करता है।
अपवाद और अनुकूलन
यह मॉड्यूल PyCompileError अपवाद भी परिभाषित करता है जो फ़ाइल को कंपाइल करने का प्रयास करते समय त्रुटि होने पर उठाया जाता है (यह केवल तभी उठाया जाएगा जब compile() फ़ंक्शन के लिए doraise विकल्प True पर सेट हो)।
compile() फ़ंक्शन का optimize विकल्प अनुकूलन स्तर को नियंत्रित करता है और इसे बिल्ट-इन compile() फ़ंक्शन को पास किया जाता है। -1 का डिफ़ॉल्ट वर्तमान इंटरप्रेटर का अनुकूलन स्तर चुनता है।