python - Qual è la cache dell'uovo Python (PYTHON_EGG_CACHE)?




4 Answers

Dalle mie ricerche risulta che alcune uova sono impacchettate come file zip e vengono salvate come tali nella directory dei site-packages del site-packages di Python.

Queste uova zippate devono essere decompresse prima di poter essere eseguite, quindi vengono espanse nella directory PYTHON_EGG_CACHE che per impostazione predefinita è ~/.python-eggs (che si trova nella home directory dell'utente). Se questo non esiste, provoca problemi durante il tentativo di eseguire le applicazioni.

Ci sono un certo numero di correzioni:

  1. Creare una .python-eggs nella directory home dell'utente e renderla scrivibile per l'utente.
  2. Creare una directory globale per la decompressione (ad esempio /tmp/python-eggs ) e impostare la variabile di ambiente PYTHON_EGG_CACHE su questa directory.
  3. Utilizzare l' -Z quando si utilizza easy_install per decomprimere il pacchetto durante l'installazione.

Ho appena aggiornato da Python 2.6.1 a 2.6.4 sul mio computer di sviluppo e all'avvio di uno script python è stato presentato il seguente messaggio:

Impossibile estrarre i file nella cache dell'uovo

Si è verificato il seguente errore durante il tentativo di estrarre i file nella cache dell'uovo di Python:

[Errno 13] Autorizzazione negata: '/var/www/.python-eggs'

La directory della cache delle uova Python è attualmente impostata su:

/var/www/.python-eggs

Forse il tuo account non ha accesso in scrittura a questa directory? È possibile modificare la directory della cache impostando la variabile di ambiente PYTHON_EGG_CACHE in modo che punti a una directory accessibile.

Non c'è nulla nei documenti python quindi sono un po 'in perdita per quanto riguarda le best practice su dove mettere questa directory e per cosa è usata.

Qualcuno può spiegare cos'è la cache dell'uovo Python?

Inoltre, puoi spiegare perché / come è diverso dalla directory dei site-packages del site-packages Python usa per memorizzare le uova (come ho capito)?




Questo è un effetto collaterale scuro dell'uso di un meccanismo altrimenti piacevole per le uova.

Le uova sono pacchetti (una directory piena di file) contenuti in un .egg file .egg per semplificare il .egg .

Sono memorizzati in /site-packages/ dir.

Finché i file memorizzati nell'uovo sono file .py , funziona alla grande. L'importazione di Python può importare oggetti da qualsiasi oggetto simile a un file, proprio come se fosse un normale file.

Ma quando qualcosa del genere .so accade di cadere lì, Python non può spiegare al SO sottostante che vuole caricare una libreria che non ha un nome fisico. E l'unica soluzione alternativa che gli autori hanno pensato è decomprimerlo in una directory temporanea. Naturalmente non è /site-packages/ poiché /site-packages/ non è scrivibile per gli utenti ordinari.

Quindi puoi o

  • impostare PYTHON_EGG_DIR su /tmp , o

  • dare l'autorizzazione utente www scrivere a /var/www/.python-eggs
    (in modo che i file non vengano decompressi ogni volta che tmp venga ripulito) o meglio allora

  • decomprimere l'uovo come suggerito da @ shalley303
    (ed evitare di decomprimere l'uovo nel tempo di esecuzione del tutto).




Puoi anche disabilitare l'uso di .egg dopo che è stato installato. Devi andare nella directory dei pacchetti del sito, estrarre il file .egg e quindi spostarlo in un file nascosto (o cancellarlo, o qualsiasi altra cosa).

Ecco un esempio di cosa ho fatto per disabilitare il file .egg MySQLdb che stava causando questo errore quando lo script Python veniva eseguito da Zabbix.

cd /usr/local/lib/python2.7/site-packages
unzip MySQL_python-1.2.3-py2.7-linux-x86_64.egg
mv MySQL_python-1.2.3-py2.7-linux-x86_64.egg .MySQL_python-1.2.3-py2.7-linux-x86_64.egg



Una semplice soluzione sarebbe quella di creare la directory e fornire accesso a www-data .

$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs



Related