Gerando Bytecode de Módulos - Python
Quando executamos um script em Python, geralmente o processo é dividido em duas etapas:
O arquivo com o código (extensão
) é compilado para um bytecode intermediário..py
Em seguida, o bytecode compilado é interpretado, o que representa a execução propriamente dita do programa.
Não precisamos gerar bytecode explicitamente, pois ele é criado automaticamente durante a execução do script Python. Se o programa importa módulos ou bibliotecas externos e essa é a primeira importação, o bytecode compilado desses módulos é salvo em um arquivo com extensão .pyc
__pycache__
.pyc
No entanto, o bytecode do script principal, ou seja, o arquivo principal do programa que é passado para o interpretador, não é salvo em um arquivo .pyc. Ele é recompilado toda vez que a aplicação é iniciada.
Suponha que temos um arquivo user.py
def printUser(username, userage):
print(f"Name: {username} Age: {userage}")
Vamos agora importar esse arquivo no módulo principal do programa, que chamaremos de app.py
import user
username = "Tom"
userage = 39
user.printUser(username, userage)
Ao executar esse script na pasta do projeto (onde o módulo user.py
__pycache__
user.cpython-311.pyc
311
Python 3.11
.pyc
. ├── __pycache__ │ └── user.cpython-311.pyc ├── app.py └── user.py
Compilando Bytecode Manualmente
Embora o bytecode seja gerado automaticamente, também é possível criá-lo manualmente. Existem várias formas de fazer isso: usando o script py_compile
compileall
Utilizando o py_compile
O script py_compile
user.py
import py_compile
py_compile.compile("user.py") # caminho para o script
Passamos o caminho do script para a função compile()
__pycache__
user.cpython-311.pyc
Utilizando o compileall
O módulo compileall
C:/python/files
python -m compileall C:/python/files
Por padrão, até mesmo arquivos em subdiretórios serão compilados. Se quisermos compilar apenas os arquivos na pasta especificada, sem incluir subpastas, usamos a opção -l
python -m compileall -l C:/python/files