O que é __pycache__?

651

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

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

user2063042
fonte
29
"É o que damos às pessoas em vez do nosso código-fonte?" - Não, você fornece o código-fonte em um bom pacote instalável, por isso é fácil de usar.
Lennart Regebro
79
Ninguém mencionou ainda, mas sua definição de cache é bizarra. O cache é simplesmente um componente que armazena dados para que solicitações futuras desses dados possam ser atendidas mais rapidamente .
Ricardo Cruz
4
Veja: python.org/dev/peps/pep-3147
Mr_and_Mrs_D
1
Como Python 3.8você pode usar uma variável de ambiente para alterar o local dos diretórios de cache irritantes: stackoverflow.com/a/57414308/1612318
Rotareti
Um cache é algo que mantém uma cópia do material, caso você precise dele novamente, para poupar a necessidade de voltar ao original para obtê-lo. Ele foi projetado para ser mais rápido do que ir para o local original. Pode ser mais rápido, porque não precisa pré-processar ou compilar as informações. Ou pode ser um armazenamento mais rápido, por exemplo, um cache de disco na RAM ou um cache da web em um disco local. Não é por natureza criptografado (embora às vezes possa ser), e nem sempre é um "arquivo de arquivos semelhantes" - pode ser um arquivo, uma carga de arquivos, um bloco de RAM etc.
rjmunro

Respostas:

518

Quando você executa um programa em python, o intérprete o compila primeiro pelo código de bytes (isso é uma simplificação excessiva) e o armazena na __pycache__pasta. Se você procurar lá, encontrará vários arquivos compartilhando os nomes dos arquivos .py na pasta do seu projeto, apenas suas extensões serão .pyc ou .pyo. Essas são versões compiladas por bytecode e otimizadas por bytecode dos arquivos do programa, respectivamente.

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

Se você estiver usando cpython (que é o mais comum, como é a implementação de referência) e não quiser essa pasta, poderá suprimi-la iniciando o interpretador com o sinalizador -B, por exemplo

python -B foo.py

Outra opção, como observado por tcaswell, é definir a variável de ambiente PYTHONDONTWRITEBYTECODEpara qualquer valor (de acordo com a página de manual do python, qualquer "string não vazia").

scott_fakename
fonte
48
Você também pode adicionar a variável de ambiente PYTHONDONTWRITEBYTECODE=<any_value>para suprimi-la permanentemente.
precisa
11
Só para esclarecer, isso é apenas para Python 3, correto?
Joe J
11
@ JoeJ sim, acho que é verdade. python2coloca os arquivos compilados no mesmo diretório que os originais, se não me engano.
scott_fakename 25/02
27
Uma ressalva importante é que o arquivo .pyc armazenado em cache será usado em vez do arquivo .py se o arquivo .py estiver ausente. Na prática, isso só acontece se você excluir (ou renomear) módulos, por isso não é uma ocorrência comum, mas se algumas coisas continuarem "lá", depois de coçar a cabeça, executando o find. -name * .pyc | O xargs rm na sua fonte é provavelmente uma boa primeira reação.
yacc143
34
find . -name '*.pyc' -deleteSim, achado tem uma bandeira para apagar os arquivos encontrados, para que você não tem que usar qualquer xargs shananigans
Vlad-ardelean
174

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

Não recomendo excluir 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 ficar obsoleto em casos extremos (ver comentários).

Os programadores de Python geralmente ignoram o bytecode. Na verdade __pycache__e *.pycsão linhas comuns para ver em .gitignorearquivos. O bytecode não se destina à distribuição e pode ser desmontado usando o dismódulo .


Se você estiver usando o OS X, poderá ocultar facilmente todas essas pastas no seu projeto executando o seguinte comando na pasta raiz do seu projeto.

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

Substitua __pycache__por *.pycpara Python 2.

Isso define um sinalizador em todos os diretórios (arquivos .pyc) informando ao Finder / Textmate 2 para excluí-los das listagens. É importante ressaltar que o bytecode está lá, está apenas oculto.

Execute o comando novamente se você criar novos módulos e desejar ocultar o novo bytecode ou se você excluir os arquivos ocultos do bytecode.


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

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

O mesmo que percorrer as pastas ocultas do projeto usando o botão direito do mouse> ocultar ...


A execução de testes de unidade é um cenário (mais nos comentários) em que a exclusão de *.pycarquivos e __pycache__pastas é realmente útil. Eu uso as seguintes linhas no meu ~/.bash_profilee apenas corro clpara limpar quando necessário.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
quebra de linha
fonte
Isso não seria desfeito toda vez que você executasse o código?
Holloway
2
@DoTheEvo: ele simplesmente não é criado, então não há aceleração na próxima vez que o módulo for carregado. Nenhum erro é gerado.
precisa
7
Esta não é uma boa resposta. O solicitante deseja saber para que servem esses arquivos. Esta resposta diz "não se preocupe com isso" e depois os faz desaparecer.
interestinglythere
36
Absolutamente incomodar em excluir estes : não é inútil. Felizmente, o Python não detectará alterações de arquivos e executará um arquivo de cache em muitas circunstâncias, levando você a pensar que "por que f ainda não funciona, eu mudei o código, por que ainda está falhando em chamadas inexistentes"? Especialmente nas estruturas de teste, o pycache por padrão é o pior.
Mike 'Pomax' Kamermans
2
Eu discordaria deste conselho para "não se incomodar em excluir esses arquivos" - já vi isso recomendado muitas vezes, mais recentemente por "How To Python" de Kenneth Reitz ("o truque do bytecode")
Louis Maddox
38

Uma __pycache__pasta é criada quando você usa a linha:

import file_name

ou tente obter informações de outro arquivo que você criou. Isso o torna um pouco mais rápido ao executar o programa pela segunda vez para abrir o outro arquivo.

Aleks. S.
fonte
27

Resposta atualizada de mais de 3.7 documentos:

Para acelerar o carregamento de módulos, o Python armazena em cache a versão compilada de cada módulo no __pycache__diretório com o nome module.version.pyc, onde a versão codifica o formato do arquivo compilado; geralmente contém o número da versão do Python. Por exemplo, no CPython versão 3.3, a versão compilada do spam.py seria armazenada em cache como __pycache__/spam.cpython-33.pyc. Essa convenção de nomenclatura permite que módulos compilados de diferentes versões e versões diferentes do Python coexistam.

Fonte: https://docs.python.org/3/tutorial/modules.html#compiled-python-files

Ou seja, esse diretório é gerado pelo Python e existe para tornar seus programas mais rápidos. Ele não deve estar comprometido com o controle de origem e deve coexistir em paz com o código-fonte local.


__pycache__é um diretório que contém arquivos de cache de bytecode gerados automaticamente pelo python, ou seja, python compilado ou .pycarquivos. Você pode estar se perguntando por que o Python, uma linguagem "interpretada", possui algum arquivo compilado. Esta questão SO aborda isso (e definitivamente vale a pena ler esta resposta ).

Os documentos python detalham exatamente como ele funciona e por que existe:

  • Foi adicionado no python 3.2 porque o sistema existente de manutenção de .pycarquivos no mesmo diretório causou vários problemas, como quando um programa era executado com intérpretes Python de versões diferentes. Para obter as especificações completas dos recursos, consulte PEP 3174 .
FluxLemur
fonte
5

do tutorial oficial do python Módulos

Para acelerar o carregamento de módulos, o Python armazena em cache a versão compilada de cada módulo no __pycache__diretório com o nome module.version.pyc, onde a versão codifica o formato do arquivo compilado; geralmente contém o número da versão do Python. Por exemplo, na versão 3.6 do CPython, a versão compilada do spam.py seria armazenada em cache como __pycache__/spam.cpython-36.pyc.

das perguntas freqüentes de programação do Python doc

Quando um módulo é importado pela primeira vez (ou quando o arquivo de origem foi alterado desde a criação do arquivo compilado atual), um arquivo .pyc contendo o código compilado deve ser criado em um __pycache__subdiretório do diretório que contém o .pyarquivo. O .pycarquivo terá um nome de arquivo que começa com o mesmo nome que o .pyarquivo e termina .pyccom um componente do meio que depende do binário python específico que o criou.

Yossarian42
fonte
5

A execução de um script python faria com que o código de bytes fosse gerado na memória e mantido até o encerramento do programa. Caso um módulo seja importado, para uma reutilização mais rápida, o Python criaria um arquivo .pyc de cache (PYC é 'Python' 'Compilado'), onde o código de bytes do módulo que está sendo importado é armazenado em cache. A idéia é acelerar o carregamento dos módulos python, evitando a recompilação (compile uma política, execute várias vezes a política) quando eles forem reimportados.

O nome do arquivo é igual ao nome do módulo. A parte após o ponto inicial indica a implementação do Python que criou o cache (poderia ser CPython) seguido pelo número da versão.

TechFree
fonte
3

O interpretador python compila o arquivo de script * .py e salva os resultados da compilação no diretório __pycache__ diretório

Quando o projeto é executado novamente, se o intérprete identificar que o script * .py não foi modificado, ele ignora a etapa de compilação e executa o arquivo * .pyc gerado anteriormente armazenado na __pycache__pasta.

Quando o projeto é complexo, você pode reduzir o tempo de preparação antes que o projeto seja executado. Se o programa for muito pequeno, você poderá ignorá-lo usando python -B abc.pya Bopção

Marcus Thornton
fonte
3

A versão 2.x do Python terá .pyc quando o interpretador compilar o código.

A versão 3.x do Python terá __pycache__ quando o interpretador compilar o código.

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$
Alok Tiwari
fonte
2

No 3.2 e posterior, o Python salva os arquivos de código de bytes compilados .pyc em um subdiretório nomeado __pycache__localizado no diretório em que seus arquivos de origem residem com nomes de arquivos que identificam a versão do Python que os criou (por exemplo, script.cpython-33.pyc)

Shashidhar Yalagi
fonte
Como evitar a criação da pasta " pycache " e todos os .pyc devem ter o mesmo nome que o arquivo .py?
Ashwani
1

Quando você importa um módulo ,

import file_name

O Python armazena o bytecode compilado no __pycache__diretório para que futuras importações possam usá-lo diretamente, em vez de precisar analisar e compilar a fonte novamente.

Isso não é feito apenas para executar um script, apenas quando um arquivo é importado.

(As versões anteriores costumavam armazenar o bytecode em cache como arquivos .pyc que agrupavam o mesmo diretório que os arquivos .py, mas a partir do Python 3 eles foram movidos para um subdiretório para tornar as coisas mais organizadas.)

PYTHONDONTWRITEBYTECODE ---> Se estiver definido como uma string não vazia, o Python não tentará gravar arquivos .pyc na importação dos módulos de origem. Isso é equivalente a especificar a opção -B.

Ehsan Barkhordar
fonte