File .pyc generati ogni volta che vengono importati gli elementi di codice corrispondenti e aggiornati se i file di codice corrispondenti sono stati aggiornati. Se i file .pyc vengono eliminati, verranno automaticamente rigenerati. Tuttavia, essi sono non cancellati automaticamente quando i file di codice corrispondenti vengono eliminati.
Ciò può causare alcuni bug davvero divertenti durante i refactors a livello di file.
Prima di tutto, puoi finire per spingere il codice che funziona solo sulla tua macchina e su quella di nessun altro. Se hai riferimenti penzolanti ai file eliminati, questi continueranno a funzionare localmente se non elimini manualmente i file .pyc pertinenti perché i file .pyc possono essere utilizzati nelle importazioni. Ciò è aggravato dal fatto che un sistema di controllo della versione configurato correttamente invierà solo file .py al repository centrale, non file .pyc, il che significa che il tuo codice può superare il "test di importazione" (importa tutto bene) bene e non lavorare sul computer di qualcun altro.
Secondo, puoi avere dei bug piuttosto terribili se trasformi i pacchetti in moduli. Quando si converte un pacchetto (una cartella con un __init__.py
file) in un modulo (un file .py), i file .pyc che una volta rappresentavano quel pacchetto rimangono. In particolare, i __init__.pyc
resti. Quindi, se hai il pacchetto pippo con un codice che non ha importanza, in seguito cancella quel pacchetto e crea un file pippo.py con qualche funzione def bar(): pass
ed esegui:
from foo import bar
ottieni:
ImportError: cannot import name bar
perché python sta ancora usando i vecchi file .pyc dal pacchetto foo, nessuno dei quali definisce bar. Questo può essere particolarmente problematico su un server web, dove il codice completamente funzionante può rompersi a causa dei file .pyc.
Come risultato di entrambi questi motivi (e forse altri), il codice di distribuzione e il codice di test dovrebbero eliminare i file .pyc, ad esempio con la seguente riga di bash:
find . -name '*.pyc' -delete
Inoltre, a partire da python 2.6, puoi eseguire python con il -B
flag per non usare file .pyc. Vedi Come evitare i file .pyc? per ulteriori dettagli.
Vedi anche: Come rimuovo tutti i file .pyc da un progetto?
rm *.pyc
. Ciò non eliminerà i file .pyc nelle cartelle nidificate. Usafind . -name '*.pyc' -delete
invece