O que é __pycache__?

Pelo que entendi, um cache é um arquivo criptografado de arquivos similares.

O que fazemos com a pasta __pycache__? É o que damos às pessoas em vez do nosso código fonte? São apenas os meus dados de entrada? Esta pasta continua a ser criada, para que serve?

Quando você executa um programa em python, o intérprete o compila para bytecode primeiro (isto é uma simplificação excessiva) e o armazena na pasta __pycache__. Se você olhar lá dentro você encontrará um monte de arquivos compartilhando os nomes dos arquivos .py na pasta do seu projeto's, apenas suas extensões serão .pyc ou .pyo. Estes são versões compiladas por bytecodes e otimizadas por bytecodes do seu programa's, respectivamente.

Como programador, pode ignorá-lo em grande parte... Tudo o que ele faz é fazer o seu programa começar um pouco mais rápido. Quando seus scripts mudarem, eles serão recompilados, e se você apagar os arquivos ou a pasta inteira e executar seu programa novamente, eles reaparecerão (a menos que você especificamente suprima esse comportamento)

Se você está usando cpython (que é o mais comum, pois é's a implementação de referência) e você não't quer essa pasta, então você pode suprimi-la iniciando o interpretador com a bandeira -B, por exemplo

python -B foo.py

Outra opção, como observado por tcaswell, é definir a variável de ambiente PYTHONDONTWRITEBYTECODE para qualquer valor (de acordo com python's man page, any "non-empty string").

Comentários (11)

__pycache__ é uma pasta contendo **Python 3 bytecode compilado e pronto para ser executado***.

Eu não'não recomendo apagar rotineiramente esses arquivos ou suprimir a criação durante o desenvolvimento, pois isso pode prejudicar o desempenho. Basta ter um comando recursivo pronto (veja abaixo) para limpar quando necessário, pois o bytecode pode se tornar obsoleto em casos de borda (veja comentários).

Os programadores Python normalmente ignoram o bytecode. De fato __pycache__ e *.pyc são linhas comuns para se ver em arquivos .gitignore'. Bytecode não é destinado para distribuição e pode ser desmontado utilizando o [módulodis`]1.


Se você estiver usando o OS X você pode facilmente esconder todas essas pastas no seu projeto, executando seguindo o comando da pasta raiz do seu projeto.

find . -name '__pycache__' -exec chflags hidden {} \;

Substitua __pycache__ por *.pyc para Python 2.

Isso estabelece uma bandeira em todos esses diretórios (arquivos .pyc) dizendo ao Finder/Textmate 2 para excluí-los das listagens. O importante é que o bytecode está lá, ele's apenas oculto.

Execute novamente o comando se você criar novos módulos e desejar ocultar novos bytecodes ou se você apagar os arquivos de bytecodes ocultos.


No Windows, o comando equivalente pode ser (não testado, o script batch é bem-vindo):

dir * /s/b | findstr __pycache__ | attrib +h +s +r

Que é o mesmo que percorrer as pastas escondidas do projecto usando o botão direito do rato > esconder...


Executar testes unitários é um cenário (mais nos comentários) onde apagar os arquivos *.pyc e as pastas __pycache__ é de fato útil. Eu utilizo as seguintes linhas no meu ~/.bash_profile' e apenas corro ocl' para limpar quando necessário.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
Comentários (10)

Em 3.2 e posteriores, o Python salva arquivos de código byte .pyc compilados em um subdiretório chamado __pycache__ localizado no diretório onde seus arquivos fonte residem com nomes de arquivos que identificam a versão Python que os criou (por exemplo, script.cpython-33.pyc)

Comentários (0)