Qual è la cache uovo Python (PYTHON_EGG_CACHE)?
-
25-09-2019 - |
Domanda
Sono appena passato da Python 2.6.1 alla 2.6.4 sulla mia macchina di sviluppo e all'avvio di uno script python è stato presentato con il seguente messaggio:
Non è possibile estrarre il file (s) per l'uovo di cache
Il seguente errore durante cercando di estrarre il file (s) al cache di uovo Python:
[Errno 13] Autorizzazione negata: '/Var/www/.python-eggs'
La directory della cache uovo Python è attualmente fissato a:
/var/www/.python-eggs
Forse il vostro account non dispone l'accesso in scrittura a questa directory? voi può cambiare la directory di cache l'impostazione della PYTHON_EGG_CACHE variabile di ambiente che punta alla directory accessibile.
non è nulla nel pitone docs così sono a un po 'di una perdita per quanto riguarda le migliori pratiche su dove mettere questa directory e che cosa ha usato per.
Qualcuno può spiegare che cosa la cache uovo Python è?
Inoltre, si può spiegare perché / come è diverso alla directory site-packages
usi Python per Conservare le uova (se ho capito bene)?
Soluzione
Da mie indagini si scopre che alcune uova sono confezionati come zip file, e vengono salvati come tali nella directory site-packages
di Python.
Queste uova zip devono essere decompressi prima che possano essere eseguiti, in modo vengono espansi 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 quando si cerca di eseguire le applicazioni.
Ci sono una serie di correzioni:
- Creare una directory
.python-eggs
nella directory home dell'utente e renderlo scrivibile per l'utente. - Creare una directory globale per la decompressione (ad es.
/tmp/python-eggs
) e impostare la variabile d'ambientePYTHON_EGG_CACHE
a questa directory. - Usa l'interruttore
-Z
quando si utilizzaeasy_install
per decomprimere il pacchetto durante l'installazione.
Altri suggerimenti
La cache pitone uovo è semplicemente una directory usata da setuptools ai pacchetti istallati conformi alla specifica href="http://peak.telecommunity.com/DevCenter/EggFormats" uovo . È possibile saperne di più setuptools qui .
Inoltre, come afferma il messaggio di errore, è possibile specificare una diversa directory della cache di uova nell'ambiente impostando PYTHON_EGG_CACHE = / some / altro / dir. Il modo più semplice per farlo è quello di impostare nel vostro ~ / .bash_profile (supponendo che si sta usando bash), in questo modo:
export PYTHON_EGG_CACHE=/some/other/dir
Potrebbe essere necessario impostare nel proprio ambiente Apache se si sta utilizzando un'applicazione Web.
Questo è un oscuro effetto collaterale di utilizzare altrimenti bel meccanismo di uova.
Le uova sono pacchetti (un elenco completo di file) confezionato in un unico file .egg
a depolyment semplificare.
sono memorizzati in /site-packages/
dir.
Fino a quando i file memorizzati nell'uovo sono file .py
funziona benissimo. Python importazione può importare le cose da qualsiasi file come oggetto proprio come lo era un file ordinario.
Ma quando qualcosa di simile accade .so
a cadere in là, pitone non può spiegare al sistema operativo sottostante che vuole caricare una libreria che non ha un nome fisico. E le Distutils unica soluzione autori hanno pensato si decomprimere in una directory temporanea. Naturalmente non è /site-packages/
poiché /site-packages/
non è scrivibile per gli utenti comuni.
Quindi è possibile
-
PYTHON_EGG_DIR
insieme a/tmp
, o -
utente danno il permesso di scrittura per
www
/var/www/.python-eggs
(In modo che i file non vengono decompressi ogni volta / tmp viene ripulito) o meglio allora -
decomprimere l'uovo come suggerito da @ shalley303
(Ed evitare decompressione delle uova nella fase di esecuzione del tutto).
Python sono zip-compressi pacchetti contenenti entrambi i moduli Python e metadati. La cache uovo è dove il contenuto estratto di dell'uovo sono memorizzati in modo che i moduli Python contenuti all'interno sono utilizzabili.
Si può anche disabilitare l'uso della .egg dopo che è stato installato. Hai bisogno di andare nella directory site-packages, estrarre il .egg, e poi spostarlo in un file nascosto (o eliminarlo, o qualsiasi altra cosa).
Ecco un esempio di quello che ho fatto per disattivare il file .egg modulo MySQLdb che stava causando questo errore quando lo script python è stato 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
diritto di Phillip B Oldham. È possibile aggiungere queste righe nel codice:
import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory
Una soluzione semplice sarebbe quello di creare la directory e fornire l'accesso www-data
ad esso.
$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs