পাইথন একটি ইন্টারপ্রেটার-ভিত্তিক ভাষা। তবে এটি داخليভাবে সোর্স কোডকে বাইট কোডে কম্পাইল করে যখন একটি স্ক্রিপ্ট (.py এক্সটেনশন) চালানো হয় এবং পরে বাইটকোড সংস্করণটি স্বয়ংক্রিয়ভাবে সরিয়ে দেওয়া হয়। যখন একটি মডিউল (পূর্ব-কম্পাইল্ড বিল্ট-ইন মডিউলগুলোর বাইরে) প্রথমবার ইম্পোর্ট করা হয়, এর কম্পাইল্ড সংস্করণও স্বয়ংক্রিয়ভাবে তৈরি হয় কিন্তু __pycache__ ফোল্ডারে .pyc এক্সটেনশনে সংরক্ষিত থাকে। একই মডিউল আবার ইম্পোর্ট করলে সেটি পুনরায় কম্পাইল না হয়ে ইতিমধ্যে তৈরি করা সংস্করণটি ব্যবহার করা হয়।
স্পষ্টভাবে পাইথন স্ক্রিপ্ট কম্পাইল করা
এক্সটেনশন .py সহ একটি পাইথন স্ক্রিপ্ট ফাইলকে চালানো ছাড়াই স্পষ্টভাবে কম্পাইল করা সম্ভব। 'py_compile' মডিউলে এই উদ্দেশ্যে 'compile()' ফাংশন রয়েছে। ফলস্বরূপ .pyc ফাইলের নামের সাথে পাইথনের সংস্করণ নম্বর যুক্ত হয়। পাইথন ৩.৭-এর ক্ষেত্রে, নামের সাথে '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 এক্সটেনশনযুক্ত বাইটকোড ফাইলটি সাধারণ স্ক্রিপ্টের মতো .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() ফাংশনও রয়েছে যা একাধিক সোর্স ফাইল কম্পাইল করে। আর্গুমেন্টként নামকৃত ফাইলগুলো কম্পাইল হয়ে স্বাভাবিকভাবে বাইট-কোড ক্যাশে সংরক্ষিত হয়। এই ফাংশন ডিরেক্টরি স্ট্রাকচার খোঁজে সোর্স ফাইল না লোকিয়ে শুধু স্পষ্টভাবে নামকৃত ফাইলগুলো কম্পাইল করে।
মডিউলটি PyCompileError এক্সসেপশনও সংজ্ঞায়িত করে যা ফাইল কম্পাইল করার চেষ্টা করার সময় এরর হলে উত্থাপিত হয় (এটি শুধু compile() ফাংশনের জন্য doraise অপশন True সেট করলে উত্থাপিত হয়)।
compile() ফাংশনের optimize অপশন অপ্টিমাইজেশন লেভেল নিয়ন্ত্রণ করে এবং বিল্ট-ইন compile() ফাংশনে পাস করা হয়। -1 এর ডিফল্ট মান বর্তমান ইন্টারপ্রেটারের অপ্টিমাইজেশন লেভেল বেছে নেয়।