2012-07-13 7 views
9

Sto cercando di compilare una serie piuttosto grande di moduli e pacchetti Python su pyo. So che questo è possibile impostando la variabile d'ambiente PYTHONOPTIMIZE o specificando -O all'avvio. Mi piacerebbe far rispettare pyo invece di pyc per ottenere l'impronta più piccola possibile. Per farlo nel mio deploy module devo creare uno script wrapper che lanci lo script vero e proprio con l'opzione -O, perché la variabile d'ambiente deve essere specificata prima di avviare l'interprete.Compilazione di file .py in .pyo senza ricorrere a uno script di wrapper

Esiste un modo per aggirare questo e imporre la creazione di pyo a livello di programmazione?

Cordiali saluti, Thorsten

risposta

17

To compilare tutti i moduli in anticipo, eseguire il seguente comando:

python -O -m compileall /path/to/your/files 

Il python compileall module si occupa della compilazione, il -O switch rende .pyo di output.

Tuttavia, non si può forzare Python di usare questi a meno che l'interruttore -O è dato per ogni corsa o il PYTHONOPTIMIZE environment var è impostato.

Nota che tutto il flag -O fa è disabilitare la dichiarazione assert e impostare il flag __debug__-False (e Python consente di ottimizzare le prove). Specificare -OO e docstring vengono eliminati. Questi non fanno molta differenza di velocità o risparmio di spazio, a meno che non si utilizzino dimensioni eccessive di docstring o codice di debug molto lento.

Vedi: What does Python optimization (-O or PYTHONOPTIMIZE) do?

+0

Grazie per la risposta, ma come sopra So dell'interruttore e vorrei evitarlo. Il motivo è che questo è uno strumento di distribuzione e voglio evitare che le persone accidentalmente distribuiscano due versioni differenti (pyc e pyo) dello stesso file. Attualmente lo faccio avvolgendo una chiamata python.exe -O in uno script python tramite os.system. Funziona ma è un po 'strano, quindi mi chiedevo se potessi liberarmene. –

+0

Sarebbe bello poterlo controllare a livello di codice (più facilmente) ... – martineau

+0

"Notare che tutto il flag -O fa è disabilitare l'istruzione asser. Specificare -OO e docstring sono scartati.Questi non fanno molta differenza di velocità o risparmi di spazio. " <- Dipende veramente da quante affermazioni 'assert' e' if __debug__' hai, no? Sai cosa dicono delle ipotesi. – DylanYoung

Problemi correlati