Risposte:
Da "Novità di Python 2.6 - Modifiche all'interprete" :
Ora è possibile impedire a Python di scrivere file .pyc o .pyo fornendo l' opzione -B all'interprete Python o impostando la variabile di ambiente PYTHONDONTWRITEBYTECODE prima di eseguire l'interprete. Questa impostazione è disponibile per i programmi Python come
sys.dont_write_bytecode
variabile e il codice Python può modificare il valore per modificare il comportamento dell'interprete.
Aggiornamento 2010-11-27: Python 3.2 risolve il problema del disordine delle cartelle di origine con i .pyc
file introducendo una __pycache__
sottocartella speciale , vedere Novità di Python 3.2 - PYC Repository Directories .
export PYTHONDONTWRITEBYTECODE=1
import sys
sys.dont_write_bytecode = True
site-packages/usercustomize.py
per farlo applicare a tutti i tuoi script. Per me questa directory era $HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
. Cf. docs.python.org/2/tutorial/…
import sys; sys.dont_write_bytecode = True
In realtà esiste un modo per farlo in Python 2.3+, ma è un po 'esoterico. Non so se te ne rendi conto, ma puoi fare quanto segue:
$ unzip -l /tmp/example.zip
Archive: /tmp/example.zip
Length Date Time Name
-------- ---- ---- ----
8467 11-26-02 22:30 jwzthreading.py
-------- -------
8467 1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip') # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'
Secondo la libreria zipimport :
Qualsiasi file può essere presente nell'archivio ZIP, ma solo i file .py e .py [co] sono disponibili per l'importazione. L'importazione ZIP di moduli dinamici (.pyd, .so) non è consentita. Nota che se un archivio contiene solo file .py, Python non tenterà di modificare l'archivio aggiungendo il corrispondente file .pyc o .pyo, il che significa che se un archivio ZIP non contiene file .pyc, l'importazione potrebbe essere piuttosto lenta.
Quindi, tutto quello che devi fare è comprimere i file, aggiungere il file zip al tuo sys.path e quindi importarli.
Se stai costruendo questo per UNIX, potresti anche considerare di impacchettare il tuo script usando questa ricetta: eseguibile zip unix , ma tieni presente che potresti doverlo modificare se hai intenzione di usare stdin o leggere qualcosa da sys.args (può essere fatto senza troppi problemi).
Nella mia esperienza, le prestazioni non soffrono troppo a causa di ciò, ma dovresti pensarci due volte prima di importare moduli molto grandi in questo modo.
In 2.5, non c'è modo di sopprimerlo, a parte misure come non dare agli utenti l'accesso in scrittura alla directory.
In python 2.6 e 3.0, tuttavia, potrebbe esserci un'impostazione nel modulo sys chiamata "dont_write_bytecode" che può essere impostata per sopprimerlo. Questo può essere impostato anche passando l'opzione "-B" o impostando la variabile di ambiente "PYTHONDONTWRITEBYTECODE"
Puoi impostare il sys.dont_write_bytecode = True
tuo sorgente, ma dovrebbe essere nel primo file Python caricato. Se esegui python somefile.py
, non otterrai somefile.pyc
.
Quando installi un'utilità usando setup.py
e entry_points=
avrai impostato sys.dont_write_bytecode
nello script di avvio. Quindi non puoi fare affidamento sullo script di avvio "predefinito" generato da setuptools.
Se avvii Python con il file python come argomento tu stesso puoi specificare -B
:
python -B somefile.py
somefile.pyc
non verrebbe generato comunque, ma non verranno .pyc
importati anche file per altri file.
Se hai qualche utilità myutil
e non puoi cambiarla, non passerà -B all'interprete Python. Basta avviarlo impostando la variabile di ambiente PYTHONDONTWRITEBYTECODE
:
PYTHONDONTWRITEBYTECODE=x myutil
Ho diversi casi di test in una suite di test e prima di eseguire la suite di test nel Terminale Mac in questo modo:
python LoginSuite.py
Eseguendo il comando in questo modo la mia directory veniva popolata con file .pyc. Ho provato il metodo indicato di seguito e ho risolto il problema:
python -B LoginSuite.py
Questo metodo funziona se si importano casi di test nella suite di test e si esegue la suite dalla riga di comando.
A partire da Python 3.8 è possibile utilizzare la variabile di ambiente PYTHONPYCACHEPREFIX
per definire una directory cache per Python.
Dai documenti di Python:
Se impostato, Python scriverà i file .pyc in una struttura di directory mirror in questo percorso, anziché nelle directory pycache all'interno della struttura di origine. Ciò equivale a specificare l'opzione -X pycache_prefix = PATH.
Esempio
Se aggiungi la seguente riga alla tua ./profile
in Linux:
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Python non creerà le fastidiose __pycache__
directory nella directory del progetto, ma le inserirà tutte~/.cache/cpython/
È possibile creare le directory in cui i moduli esistono in sola lettura per l'utente su cui è in esecuzione l'interprete Python.
Non penso che ci sia un'opzione più elegante. PEP 304 sembra essere stato un tentativo di introdurre una semplice opzione per questo, ma sembra essere stato abbandonato.
Immagino che ci sia probabilmente qualche altro problema che stai cercando di risolvere, per cui la disabilitazione di .py [co] sembra essere una soluzione alternativa, ma probabilmente sarà meglio attaccare qualunque sia questo problema originale.
Soluzione per ipython 6.2.1 using python 3.5.2
(testato su Ubuntu 16.04 e Windows 10):
Ipython
non rispetta %env PYTHONDONTWRITEBYTECODE =1
se impostato ipython
nell'interprete o durante l'avvio in ~/.ipython/profile-default/startup/00-startup.ipy
. Invece usando quanto segue nel tuo~.ipython/profile-default/startup/00-startup.py
import sys
sys.dont_write_bytecode=True
Per quanto ne so, Python compilerà tutti i moduli "importati". Tuttavia python NON compilerà uno script python eseguito usando: "python script.py" (compilerà comunque tutti i moduli importati dallo script).
La vera domanda è: perché non vuoi che Python compili i moduli? Probabilmente potresti automatizzare un modo per ripulirli se si frappongono.
.pyc
file bytecode non aggiornati . Per qualche motivo, quando cambio classe / modulo, il .pyc
file non viene aggiornato. Quindi, quando lo importa dopo aver modificato il .py
file, utilizzerà comunque il .pyc
file, causando errori