2013-08-19 10 views
8

Sto collegando un'applicazione Python con il suo ambiente virtenv all'interno di un RPM per una distribuzione più semplice. È una buona decisione di saltare tutti i file .pyo e .pyc?Posso omettere i file .pyo e .pyc in un RPM?

Quello che vorrei fare è invocare compileall.py nell'azione post-installazione dall'istanza virtenv. Funziona, o questo rovinerà le cose?

Nota: mi rendo conto che potrei provare su una macchina, ma a.) Questo non mi darebbe una risposta definitiva sul fatto che questo funzionerà su altre macchine eb). Altri potrebbero avere la stessa domanda e io non ha trovato risposta.

risposta

3

Si potrebbe anzi li omettere - o sono generati (se si ha accesso in scrittura), oppure il .py viene analizzato ogni volta che lo si importa (che costa tempo).

Ma, a seconda della distribuzione, il sistema RPM potrebbe contenere semplici script per la compilazione .py file e raggruppare i file .pyo e .pyc sulla distribuzione, il che rende il compito abbastanza facile.

$ rpm --showrc | grep -A 7 py.*_compile 
-14: py3_compile(O) 
find %1 -name '*.pyc' -exec rm -f {} ";" 
python3 -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
%{-O: 
find %1 -name '*.pyo' -exec rm -f {} ";" 
python3 -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
} 
-14: py3_incdir /usr/include/python3.3m 
-- 
-14: py_compile(O) 
find %1 -name '*.pyc' -exec rm -f {} \; 
python -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
%{-O: 
find %1 -name '*.pyo' -exec rm -f {} \; 
python -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
} 
-14: py_incdir %{py_prefix}/include/python%{py_ver} 

I. e., È possibile inserire risp. %py_compile. %py3_compile nella sezione %build e hai ciò di cui hai bisogno.

Ma, come detto, anche voi potete ometterli se volete usarli da diverse installazioni Python di vari numeri di versione. Ma allora dovresti assicurarti che i file .pyc e .pyo non vengano mai creati, in quanto ciò potrebbe rovinare le cose.

+0

Whoa, bello. C'è un modo per sovrascrivere il 'python' usato, però? Come ho scritto nella mia domanda, è all'interno di un 'virtenv'. Nota a margine: il motivo principale per ometterli è la dimensione risultante del pacchetto. – 0xC0000022L

+0

È possibile sovrascriverlo sostituendo le macro menzionate nel file '.rpmrc' o' .rpmmacros'. – glglgl

+0

usando l'opzione '--define', perché l'intero passo di costruzione è scriptato e alcuni dei parametri vengono calcolati. – 0xC0000022L

1

È sicuro fino a quando si hanno i loro file .py. Come i file .pyo e .pyc vengono generati dai file originali .py.

Vedi anche What do the python file extensions, .pyc .pyd .pyo stand for? e If Python is interpreted, what are .pyc files?

+1

Grazie. So * cosa * sono, ma mi piacerebbe comunque rigenerarli dopo l'installazione di RPM. Quindi la mia domanda va un po 'oltre la portata della tua risposta :) (anche w.r.t. il fatto che io uso 'virtenv' che sembra cambiare alcune regole) – 0xC0000022L

Problemi correlati