Генерация байткода модулей

Последнее обновление: 01.02.2024

При выполнении скрипта на языке Python все выполнение в общем случае разбивается на две стадии:

  1. Файл с кодом (файл с расширением .py) компилируется в промежуточный байткод.

  2. Далее скомпилированный байткодом интерпретируется, то есть происходит собственно выполнение программы

При этом нам не надо явным образом генерировать никакой байткод, он создается неявно при выполнении скрипта Python. Если программа импортирует внешние модули/библиотеки и они импортируются первый раз, то их скомпилированный байткод сохраняется сохраняется в файле с расширением .pyc и кэшируется в каталоге __pycache__ в папке, где расположен файл с кодом python. Если мы вносим в исходный файл библиотеки изменения, то Python перекомпилирует файл байткода. Если изменений в коде нет, то загружается ранее скомпилированный байткод из файла *.pyc. Это позволяет оптимизировать работу с приложением, быстрее его компилировать и выполнять.

Однако байткод основного скрипта, который представляет основной файл программы и который передается интерпретатору python, не сохраняется в файле *.pyc и перекомпилируется каждый раз при запуске приложения.

Допустим, в папке проекта у нас размещен файл user.py со простейшей функцией, которая принимает два параметра и выводит их значения:

def printUser(username, userage):
    print(f"Name: {username}  Age:{userage}")

Подключим этот файл в главном модуле программы, который пусть называется app.py:

import user
username = "Tom"
userage = 39

user.printUser(username, userage)

При выполнении этого скрипта в папке проекте (где располагается модуль "user.py") будет создан каталог __pycache__. А в нем будет сгенерирован файл байткода, который будет наподобие следующего user.cpython-версия.pyc, где в качестве версии будет применяться версия используемого интерпретатора, например, 311 (для версии Python 3.11). Сгенерированный pyc-файл является бинарным, поэтому текстовом редакторе нет смысла его открывать.

__pycache__ и модули в языке программирования Python

Ручная компиляция байткода

Хотя файл байткода создается автоматически, мы вручную можем его сгенерировать. Для этого есть несколько способов: компиляция с помощью скрипта py_compile и компиляция с помощью модуля compileall.

Скрипт py_compile применяется для компиляции отдельных файлов. Для компиляции произвольного скрипта user.py в файл с байткодом мы могли бы использовать следующую программу:

import py_compile

py_compile.compile("user.py")   # передаем путь к скрипту

Для компиляции в функцию compile() передаем путь к скрипту. После выполнения программы в текущей папке также будет сгенерирован каталог __pycache__, а в нем файл user.cpython-311.pyc

Модуль compileall применяется для компиляции всех файлов Python по определенным путям. Например, скомпилируем все файлы в каталоге C:/python/files

python -m compileall c:\python\files

По умолчанию компилируются даже те файлы, которые содержатся в подкаталогах. Если надо скомпилировать только те файлы, которые располагаются непосредственно в указанно папке, то применяется опция -l

python -m compileall c:\python\files -l
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850