Perché py e non pyc o pyo?


8

Quando installo un pacchetto deb di Python, supponiamo che python-numpyi file siano semplici file Python. Come faccio a dire al gestore dei pacchetti - che in realtà preferirei usare i file pyc o anche meglio - pyo?

Risposte:


12

Li hai già e li stai già usando

Le applicazioni Python ben impacchettate vengono compilate in .pycfile in uno script eseguito dopo l' installazione dei file. Ciò è necessario in base alle linee guida per il packaging per essere in grado di adottare l'installazione Python che stai utilizzando in quel momento. Ricorda che i .pycfile sono molto specifici per il tuo sistema (versione e dipendenze di Python).

Tutti .pyoe .pycfile sono quindi espressamente esclusi nei pacchetti e contrassegnati come errori da Lintian :

I file sorgente Python compilati non devono essere inclusi nel pacchetto. Questi file devono essere rimossi dal pacchetto e creati al momento dell'installazione del pacchetto nel postinst.

Fare riferimento alla sezione 2.6 ( Moduli Byte-Compilation ) di Debian Python Policy per i dettagli.

Gravità: grave, Certezza: certo

Nel caso di python-numpyquesta compilazione di byte post-installazione è gestita dall'hook debycper di pycentral. Dopo l'installazione appare così:

ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx  1 root root     47 Mar 20  2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r--  1 root root 251912 Aug  6 22:06 add_newdocs.pyc

Qualche informazione in più

Il motivo per cui questi .pyc/ .pyofile non vengono compilati in fase di esecuzione durante il primo avvio dell'applicazione come previsto è il seguente.

I file Python sono installati in una directory a livello di sistema, disponibile per tutti gli utenti sul sistema. Ogni volta che un utente avvia l'applicazione, l'interprete Python può leggere i .pyfile, ma non può scrivere nelle directory (ad es /usr/lib/python2.7/dist-packages/.). Questo fa parte della sicurezza generale in tutti i sistemi Linux; gli utenti non dovrebbero scrivere /usr, solo con i diritti di root questo dovrebbe essere possibile. Per questo motivo, gli hook APT compileranno i file Python per te al momento dell'installazione; in primo luogo per ridurre al minimo le dimensioni del pacchetto, in secondo luogo per essere in grado di riattivare gli hook una volta che qualcosa cambia sul sistema in merito a Python, perché è necessario ricompilare quando diventano incompatibili durante gli aggiornamenti, ad esempio.

Ciò, tuttavia, non influisce sui normali file Python di proprietà dell'utente che vengono compilati in fase di esecuzione.


Quindi dovrei rendere /usr/share/pyshared/scrivibile a me stesso, al fine di consentire a Python di compilare i file al primo avvio.
Adobe,

4
@Adobe Cosa? no! Non rendere mai scrivibili queste directory di sistema per gli utenti. La gestione dei pacchetti li ha già compilati per te (come da quello che stavo cercando di dire nella mia risposta). Ora aggiornato per essere più chiaro al riguardo.
gertvdijk,

Ora, che ho appena visto /usr/lib/python2.7/dist-packages/numpy, ci sono dei pycfile. Ricordo di aver guardato lì su installazioni Seveal - e c'erano solo semplici file PY. Quindi in un certo senso "non riesco a riprodurre il bug".
Adobe,

L'unico motivo per cui .pycnon ci sarebbe ancora è che il pacchetto non è stato installato completamente. Dopo aver disimballato ci sono altri passi da fare. IIRC l'hook python-central viene eseguito solo dopo l'installazione di tutti i pacchetti. Quindi, in una sessione APT in esecuzione o interrotta durante l'installazione del pacchetto, l'osservazione che hai descritto può essere fatta probabilmente.
gertvdijk,
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.