O que é o formato de ficheiro PYC?
Arquivos .pyc são usados pela linguagem de programação Python. Um arquivo .pyc é um executável que contém bytecode compilado para um programa escrito em código-fonte Python. O bytecode é um conjunto de instruções para o interpretador executar o programa sem analisar novamente o código original em cada inicialização, o que acelera o tempo de importação e início.
Arquivos .pyc são acompanhados por seus arquivos de origem .py relacionados. O Python compila um arquivo .py e salva o resultado em um arquivo .pyc, que pode então ser usado para executar o programa diretamente. Desde o Python 3.2, esses arquivos de cache são colocados em um subdiretório __pycache__ ao lado da origem, com a versão do interpretador incorporada no nome do arquivo (por exemplo, script.cpython-312.pyc).
Cada arquivo .pyc começa com um cabeçalho de 16 bytes. Os primeiros dois bytes são um número mágico específico da versão - ele muda a cada lançamento do CPython - seguido por 0x0D 0x0A (CR LF) nos bytes 2-3. Os bytes restantes do cabeçalho contêm um carimbo de data/hora e o tamanho do arquivo de origem (o padrão) ou um hash do arquivo de origem para compilações determinísticas e reproduzíveis, um esquema introduzido pela PEP 552 no Python 3.7. Após o cabeçalho, o arquivo contém um objeto de código serializado (marshalled) que pode ser inspecionado com o módulo integrado dis do Python.
O bytecode .pyc está vinculado a uma versão específica do CPython - um arquivo compilado no Python 3.11 não será carregado no Python 3.12. O antigo formato de bytecode otimizado .pyo foi removido no Python 3.5; compilações otimizadas agora produzem arquivos .opt-1.pyc ou .opt-2.pyc. Para descompilar um .pyc de volta para um código legível, ferramentas como uncompyle6, decompyle3 e pycdc (Decompyle++) são comumente usadas, embora a compatibilidade varie conforme a versão do Python. No Windows, módulos de extensão compilados usam o formato .pyd relacionado.
Segurança e proteção
RISCO: MEDIUMUm .pyc é um bytecode que o interpretador Python EXECUTA, portanto, um .pyc malicioso pode executar código arbitrário como um script - nunca execute um .pyc de uma fonte não confiável. Também é uma técnica comum para ocultar malware (enviando apenas o bytecode compilado). Por outro lado, distribuir seu próprio código como .pyc oferece uma proteção muito fraca: ele pode ser descompilado e, no mínimo, desmontado com o módulo 'dis' incluído, portanto NÃO é uma forma real de manter o código secreto. Excluir arquivos __pycache__ / .pyc é seguro - o Python os regenera automaticamente a partir das fontes .py.
Detalhes do formato
em resumoProgramas que abrem arquivos PYC
Detalhes técnicos
especificação profunda| Desenvolvedor | Python Software Foundation (CPython) |
| Tipo MIME | application/x-python-code |
| Estrutura do arquivo | Binário - cabeçalho versionado de 16 bytes seguido por um objeto de código Python serializado |
| Número mágico | Bytes 0-1: valor de 2 bytes específico da versão (difere por lançamento do CPython); bytes 2-3: sempre 0x0D 0x0A (CR LF) |
| Layout do cabeçalho | Mágico de 32 bits, sinalizadores de campo de bits de 32 bits, seguidos por mtime de 32 bits + tamanho da fonte de 32 bits (modo timestamp) ou um hash da fonte de 32 bits (modo hash PEP 552) |
| Diretório de cache | Armazenado em __pycache__/ desde o Python 3.2; o nome do arquivo codifica a versão do interpretador, ex: script.cpython-312.pyc |
| Compatibilidade de versão | Cada versão do CPython grava um número mágico exclusivo; um .pyc do Python 3.11 não será carregado no 3.12 e vice-versa |
| Portabilidade de plataforma | Independente de plataforma dentro da mesma versão do CPython - o mesmo .pyc roda em Windows, macOS e Linux com um interpretador correspondente |
| Variantes otimizadas | python -O e python -OO produzem .opt-1.pyc e .opt-2.pyc (removem asserts e docstrings); a extensão .pyo foi aposentada no Python 3.5 |
| Controle de geração automática | O CPython grava arquivos .pyc automaticamente na importação; suprimido pela flag -B ou pela variável de ambiente PYTHONDONTWRITEBYTECODE=1 |
| Desmontagem / descompilação | O módulo dis integrado do Python desmonta o bytecode; ferramentas de terceiros uncompyle6, decompyle3 e pycdc (Decompyle++) tentam a reconstrução do código-fonte |
| Formato de serialização interna | Objetos de código são serializados com o módulo marshal - um formato binário compacto distinto do pickle, não faz parte da API pública estável |
| Compilações baseadas em hash | A PEP 552 (Python 3.7+) introduziu arquivos .pyc baseados em hash: o cabeçalho armazena um hash do arquivo de origem em vez do mtime para compilações reproduzíveis |
| Lançado | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Padrão aberto | Sim · livre de royalties |
| Especificação | docs.python.org |
Conversões de PYC
Perguntas e Respostas da Comunidade
perguntado por usuáriosAinda não há perguntas - seja o primeiro a perguntar sobre arquivos PYC.