Generarea bytecode-ului modulelor
La executarea unui script în limbajul Python, execuția este, în general, împărțită în două etape:
- Fișierul cu codul (fișierul cu extensia .py) este compilat într-un bytecode intermediar
- Apoi bytecode-ul compilat este interpretat, adică are loc execuția propriu-zisă a programului
În acest proces, nu trebuie să generăm explicit niciun bytecode; acesta este creat implicit în timpul execuției scriptului Python. Dacă programul importă module/biblioteci externe și acestea sunt importate pentru prima dată, bytecode-ul lor compilat este salvat într-un fișier cu extensia .pyc și este stocat în directorul __pycache__ din folderul în care se află fișierul cu codul Python
Dacă aducem modificări în fișierul sursă al bibliotecii, Python recompilează fișierul bytecode. Dacă nu există modificări în cod, este încărcat bytecode-ul compilat anterior din fișierul *.pyc. Acest lucru permite optimizarea lucrului cu aplicația, compilarea și execuția ei mai rapidă.
Cu toate acestea, bytecode-ul scriptului principal, care reprezintă fișierul principal al programului și care este transmis interpretului Python, nu este salvat în fișierul *.pyc și este recompilat de fiecare dată la lansarea aplicației.
Să presupunem că în folderul proiectului avem un fișier user.py cu o funcție simplă care primește doi parametri și afișează valorile lor:
def printUser(username, userage):
print(f"Name: {username} Age:{userage}")
Conectăm acest fișier în modulul principal al programului, pe care îl vom numi app.py:
import user
username = "Tom"
userage = 39
user.printUser(username, userage)
La executarea acestui script, în folderul proiectului (unde se află modulul "user.py") va fi creat directorul __pycache__. În acesta va fi generat un fișier bytecode, care va fi similar cu user.cpython-versiune.pyc, unde versiunea va corespunde versiunii interpretului utilizat, de exemplu, 311 (pentru versiunea Python 3.11). Fișierul pyc generat este binar, deci nu are sens să fie deschis într-un editor de text.

Compilarea manuală a bytecode-ului
Deși fișierul bytecode este creat automat, putem să-l generăm manual. Există câteva metode pentru acest lucru: compilarea cu ajutorul scriptului py_compile și compilarea cu ajutorul modulului compileall.
Scriptul py_compile este utilizat pentru compilarea fișierelor individuale. Pentru a compila un script arbitrar, user.py, într-un fișier cu bytecode, am putea folosi următorul program:
import py_compile
py_compile.compile("user.py") # transmitem calea către script
Pentru compilare, transmitem calea către script funcției compile(). După execuția programului, în folderul curent va fi generat și un director __pycache__, iar în el un fișier user.cpython-311.pyc
Modulul compileall este utilizat pentru a compila toate fișierele Python din anumite locații. De exemplu, vom compila toate fișierele din directorul C:/python/files
python -m compileall c:\python\files
În mod implicit, sunt compilate chiar și acele fișiere care se află în subdirectoare. Dacă dorim să compilăm doar fișierele care se află direct în folderul specificat, se utilizează opțiunea -l
python -m compileall c:\python\files -l