Che cos'è __pycache__?


653

Da quanto ho capito, una cache è un file crittografato di file simili.

Cosa facciamo con la __pycache__cartella? È ciò che diamo alle persone invece del nostro codice sorgente? Sono solo i miei dati di input? Questa cartella continua a essere creata, a cosa serve?


29
"È ciò che diamo alle persone invece del nostro codice sorgente?" - No, dai loro il codice sorgente in un bel pacchetto installabile, quindi è facile da usare.
Lennart Regebro,

79
Nessuno ancora menzionato, ma la tua definizione di cache è bizzarra. La cache è semplicemente un componente che memorizza i dati in modo che le richieste future per tali dati possano essere soddisfatte più rapidamente .
Ricardo Cruz,


1
Dal momento che Python 3.8è possibile utilizzare una variabile di ambiente per modificare la posizione per le directory di cache fastidiosi: stackoverflow.com/a/57414308/1612318
Rotareti

Una cache è qualcosa che conserva una copia delle cose nel caso in cui ne abbiate bisogno di nuovo, per evitare di dover tornare all'originale per ottenerlo. È progettato per essere più veloce rispetto al luogo originale. Potrebbe essere più veloce perché non deve pre-elaborare o compilare le informazioni. Oppure potrebbe essere una memoria più veloce, ad esempio una cache del disco nella RAM o una cache Web su un disco locale. Non è per sua natura crittografato (anche se a volte potrebbe essere), e non è sempre un "file di file simili" - può essere un file, un carico di file, un blocco di RAM ecc.
rjmunro

Risposte:


519

Quando esegui un programma in Python, l'interprete lo compila prima in bytecode (questa è una semplificazione eccessiva) e lo memorizza nella __pycache__cartella. Se guardi lì dentro troverai un mucchio di file che condividono i nomi dei file .py nella cartella del tuo progetto, solo le loro estensioni saranno .pyc o .pyo. Queste sono rispettivamente versioni compilate per codice e ottimizzate per codice compilato dei file del programma.

Come programmatore, puoi semplicemente ignorarlo ... Tutto ciò che fa è rendere il tuo programma un po 'più veloce. Quando i tuoi script cambiano, verranno ricompilati e se elimini i file o l'intera cartella ed esegui di nuovo il tuo programma, riappariranno (a meno che tu non sopporti specificamente quel comportamento)

Se stai usando cpython (che è il più comune, in quanto è l'implementazione di riferimento) e non vuoi quella cartella, puoi sopprimerlo avviando l'interprete con il flag -B, ad esempio

python -B foo.py

Un'altra opzione, come notato da tcaswell, è di impostare la variabile di ambiente PYTHONDONTWRITEBYTECODE su qualsiasi valore (secondo la pagina man di python, qualsiasi "stringa non vuota").


48
È inoltre possibile aggiungere la variabile di ambiente PYTHONDONTWRITEBYTECODE=<any_value>per eliminarla in modo permanente.
Mark Tolonen,

11
Giusto per chiarire, questo è solo per Python 3, giusto?
Joe J,

11
@JoeJ sì, penso sia vero. python2mette i file compilati nella stessa directory degli originali, se non sbaglio.
nome_scott

27
Un avvertimento IMPORTANTE è che verrà utilizzato il file .pyc memorizzato nella cache anziché il file .py se manca il file .py. In pratica, ciò accade solo se elimini (o rinomini) i moduli, quindi non è un caso comune, ma se alcune cose continuano a essere "lì", dopo aver grattato la testa, corri a trovare. -name * .pyc | xargs rm sulla tua fonte è probabilmente una buona prima reazione.
yacc143,

34
find . -name '*.pyc' -deleteSì, find ha un flag per eliminare i file trovati, quindi non devi usare alcun xargs shananigans
vlad-ardelean

175

__pycache__è una cartella contenente il bytecode Python 3 compilato e pronto per essere eseguito .

Non consiglio di eliminare regolarmente questi file o di sopprimere la creazione durante lo sviluppo poiché ciò potrebbe compromettere le prestazioni. Tieni pronto un comando ricorsivo (vedi sotto) per ripulire quando necessario poiché il bytecode può diventare stantio in casi limite (vedi commenti).

I programmatori Python di solito ignorano il bytecode. Anzi __pycache__e *.pycsono linee comuni da vedere nei .gitignorefile. Il bytecode non è pensato per la distribuzione e può essere disassemblato utilizzando il dismodulo .


Se stai usando OS X puoi facilmente nascondere tutte queste cartelle nel tuo progetto eseguendo il seguente comando dalla cartella principale del tuo progetto.

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

Sostituisci __pycache__con *.pycper Python 2.

Questo imposta un flag su tutte quelle directory (file .pyc) che dicono a Finder / Textmate 2 di escluderle dagli elenchi. È importante sottolineare che il bytecode è lì, è appena nascosto.

Eseguire nuovamente il comando se si creano nuovi moduli e si desidera nascondere un nuovo bytecode o se si eliminano i file nascosti bytecode.


Su Windows il comando equivalente potrebbe essere (non testato, benvenuto in batch script):

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

È come passare attraverso il progetto per nascondere le cartelle usando il tasto destro> nascondi ...


L'esecuzione di unit test è uno scenario (più nei commenti) in cui è davvero utile eliminare *.pycfile e __pycache__cartelle. Uso le seguenti righe nel mio ~/.bash_profilee corro solo clper ripulire quando necessario.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

Questo non sarebbe annullato ogni volta che esegui il codice?
Holloway,

2
@DoTheEvo: semplicemente non viene creato, quindi la prossima volta che il modulo viene caricato non viene accelerato. Non viene generato alcun errore.
Petr Viktorin,

7
Questa non è una buona risposta. L'asker vuole sapere a cosa servono questi file. Questa risposta dice "non preoccuparti" e poi li fa scomparire.
interessante il

36
Assolutamente preoccuparsi di eliminarli : non è inutile. Python non rileverà felicemente le modifiche ai file ed eseguirà un file di cache in molte circostanze, spingendoti verso il muro con "perché la f continua a non funzionare, ho cambiato il codice, perché continua a fallire nelle chiamate inesistenti" senza senso. Soprattutto nei framework di test, la peggiore è pycache per impostazione predefinita.
Mike 'Pomax' Kamermans,

2
Non sarei d'accordo con questo consiglio di "non preoccuparsi di cancellare questi file" - l'ho visto molte volte, più recentemente da "How To Python" di Kenneth Reitz ("il trucco bytecode")
Louis Maddox,

38

Una __pycache__cartella viene creata quando si utilizza la riga:

import file_name

oppure prova a ottenere informazioni da un altro file che hai creato. Questo rende un po 'più veloce quando si esegue il programma la seconda volta per aprire l'altro file.


27

Risposta aggiornata da più di 3.7 documenti:

Per velocizzare il caricamento dei moduli, Python memorizza nella cache la versione compilata di ciascun modulo nella __pycache__directory sotto il nome module.version.pyc, dove la versione codifica il formato del file compilato; generalmente contiene il numero di versione di Python. Ad esempio, nella versione 3.3 di CPython la versione compilata di spam.py verrebbe memorizzata nella cache come __pycache__/spam.cpython-33.pyc. Questa convenzione di denominazione consente la coesistenza di moduli compilati di diverse versioni e versioni diverse di Python.

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

Cioè, questa directory è generata da Python ed esiste per rendere i programmi più veloci. Non dovrebbe essere impegnato nel controllo del codice sorgente e dovrebbe coesistere in pace con il codice sorgente locale.


__pycache__è una directory che contiene file di cache bytecode che vengono generati automaticamente da Python, ovvero .pycfile Python compilati o . Ci si potrebbe chiedere perché Python, un linguaggio "interpretato", abbia dei file compilati. Questa domanda SO affronta questo (e vale sicuramente la pena leggere questa risposta ).

I documenti di Python approfondiscono esattamente come funziona e perché esiste:

  • È stato aggiunto in Python 3.2 perché il sistema esistente di gestione dei .pycfile nella stessa directory causava vari problemi, come quando un programma veniva eseguito con interpreti Python di versioni diverse. Per le specifiche complete delle funzionalità, vedere PEP 3174 .

5

dal pitone esercitazione ufficiale Moduli

Per accelerare il caricamento dei moduli, Python memorizza nella cache la versione compilata di ciascun modulo nella __pycache__directory sotto il nome module.version.pyc, dove la versione codifica il formato del file compilato; generalmente contiene il numero di versione di Python. Ad esempio, nella versione 3.6 di CPython la versione compilata di spam.py verrebbe memorizzata nella cache come __pycache__/spam.cpython-36.pyc.

da Python doc Domande frequenti sulla programmazione

Quando un modulo viene importato per la prima volta (o quando il file sorgente è cambiato dalla creazione del file compilato corrente), è necessario creare un file .pyc contenente il codice compilato in una __pycache__sottodirectory della directory contenente il .pyfile. Il .pycfile avrà un nome file che inizia con lo stesso nome del .pyfile e termina .pyccon un componente intermedio che dipende dal particolare binario python che lo ha creato.


5

L'esecuzione di uno script Python provocherebbe la generazione del codice byte in memoria e la sua conservazione fino allo spegnimento del programma. Nel caso in cui un modulo venga importato, per una riutilizzabilità più rapida, Python creerebbe un file .pyc della cache (PYC è 'Python' 'Compilato') in cui viene memorizzato nella cache il codice byte del modulo da importare. L'idea è quella di velocizzare il caricamento dei moduli Python evitando la ricompilazione (compilare una volta, eseguire più volte la politica) quando vengono reimportati.

Il nome del file è uguale al nome del modulo. La parte dopo il punto iniziale indica l'implementazione di Python che ha creato la cache (potrebbe essere CPython) seguita dal suo numero di versione.


3

L'interprete python compila il file di script * .py e salva i risultati della compilation in __pycache__ directory.

Quando il progetto viene eseguito nuovamente, se l'interprete identifica che lo script * .py non è stato modificato, salta la fase di compilazione ed esegue il file * .pyc precedentemente generato memorizzato nella __pycache__cartella.

Quando il progetto è complesso, è possibile ridurre i tempi di preparazione prima che il progetto venga eseguito. Se il programma è troppo piccolo, puoi ignorarlo usando python -B abc.pyl' Bopzione.


3

Python Versione 2.x avrà .pyc quando l'interprete compila il codice.

Python Versione 3.x avrà __pycache__ quando l'interprete compila il codice.

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$

2

In 3.2 e versioni successive, Python salva i file di codice byte compilati .pyc in una sottodirectory denominata __pycache__situata nella directory in cui risiedono i file sorgente con nomi di file che identificano la versione di Python che li ha creati (ad esempio script.cpython-33.pyc)


Come posso evitare la creazione della cartella " pycache " e tutti i file .pyc dovrebbero essere nominati come file .py?
Ashwani,

1

Quando importi un modulo ,

import file_name

Python memorizza il bytecode compilato nella __pycache__directory in modo che le importazioni future possano utilizzarlo direttamente, anziché dover analizzare e compilare nuovamente l'origine.

Non lo fa solo per l'esecuzione di uno script, solo quando viene importato un file.

(Le versioni precedenti usavano per memorizzare il bytecode memorizzato nella cache come file .pyc che occupavano la stessa directory dei file .py, ma a partire da Python 3 sono stati spostati in una sottodirectory per rendere le cose più pulite.)

PYTHONDONTWRITEBYTECODE ---> Se impostato su una stringa non vuota, Python non tenterà di scrivere file .pyc durante l'importazione dei moduli di origine. Ciò equivale a specificare l'opzione -B.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.