Quel est le cache d'oeuf Python (PYTHON_EGG_CACHE)?
-
25-09-2019 - |
Question
je viens de Python 2.6.1 mis à jour à 2.6.4 sur ma machine de développement et lors du démarrage d'un script python a été présenté avec le message suivant:
Impossible d'extraire le fichier (s) dans le cache d'oeuf
L'erreur suivante est survenue lors de en essayant d'extraire le fichier (s) à la cache oeuf Python:
[Errno 13] Autorisation refusée: '/Var/www/.python-eggs'
Le répertoire du cache d'oeuf Python est actuellement fixé à:
/var/www/.python-eggs
Peut-être que votre compte n'a pas l'accès en écriture à ce répertoire? Toi peut changer le répertoire du cache par le réglage de la PYTHON_EGG_CACHE la variable d'environnement pour pointer vers un répertoire accessible.
Il n'y a rien dans le python docs pour Je suis un peu une perte en ce qui concerne les meilleures pratiques sur l'endroit où placer ce répertoire et ce qu'il est utilisé pour.
Quelqu'un peut-il expliquer ce que le cache d'oeuf Python est?
En outre, pouvez-vous expliquer pourquoi / comment il est différent dans le répertoire site-packages
Python utilise pour stocker des œufs (si je comprends bien)?
La solution
D'après mes recherches, il se trouve que certains œufs sont emballés sous forme de fichiers zip, et sont enregistrés en tant que tels dans le répertoire site-packages
Python.
Ces œufs doivent être compressés décompressé avant de pouvoir être exécutés, sont donc développés dans le répertoire par défaut PYTHON_EGG_CACHE
qui est ~/.python-eggs
(situé dans le répertoire de l'utilisateur). Si cela n'existe pas, il provoque des problèmes lors de l'exécution des applications.
Il y a un certain nombre de corrections:
- Créez un répertoire
.python-eggs
dans le répertoire personnel de l'utilisateur et de le rendre accessible en écriture pour l'utilisateur. - Créez un répertoire global pour dézipper (par exemple.
/tmp/python-eggs
) et définir l'environnementPYTHON_EGG_CACHE
variables dans ce répertoire. - A l'aide du commutateur de
-Z
lors de l'utilisationeasy_install
pour décompresser le paquet lors de l'installation.
Autres conseils
Le cache d'oeuf python est tout simplement un répertoire utilisé par setuptools pour stocker les paquets installés qui sont conformes à la spécification des œufs de la . Vous pouvez en savoir plus sur setuptools .
En outre, comme l'indique le message d'erreur, vous pouvez spécifier un répertoire de cache d'oeuf différent dans votre environnement en définissant PYTHON_EGG_CACHE = / some / autre / dir. La façon la plus simple est de le mettre dans votre ~ / .bash_profile (en supposant que vous utilisez bash), comme ceci:
export PYTHON_EGG_CACHE=/some/other/dir
Vous devrez peut-être le mettre dans votre environnement Apache si vous utilisez une application Web.
Ceci est un effet secondaire sombre d'utiliser autrement agréable mécanisme oeufs.
Les œufs sont des paquets (un répertoire complet des fichiers) emballés dans un seul fichier .egg
pour simplifier depolyment.
Ils sont stockés dans /site-packages/
dir.
Tant que les fichiers stockés dans l'œuf sont des fichiers .py
il fonctionne très bien. import Python peut importer les choses de tout objet de type fichier, tout comme il était un fichier ordinaire.
Mais quand quelque chose comme .so
arrive à tomber là-dedans, python ne peut pas expliquer le système d'exploitation sous-jacente qu'il veut charger une bibliothèque qui ne dispose pas d'un nom physique. Et la seule solution distutils auteurs ont pensé est Dézippage dans un répertoire temp. Bien entendu, il ne /site-packages/
depuis /site-packages/
est pas accessible en écriture pour les utilisateurs ordinaires.
Vous pouvez
-
set
PYTHON_EGG_DIR
à/tmp
, ou -
donner la permission d'écriture
www
utilisateur à/var/www/.python-eggs
(De sorte que les fichiers ne soient décompressés pas à chaque fois / tmp est nettoyé) ou mieux puis -
décompressez l'œuf comme suggéré par @ shalley303
(Et éviter la décompression de l'oeuf dans la période de temps au total).
oeufs de python sont des paquets compressés zip contenant les deux modules python et des métadonnées. Le cache d'oeuf est où les contenus extraits de l'œuf sont stockés de sorte que les modules python fournis sont utilisables.
Vous pouvez également désactiver l'utilisation du .egg après qu'il a été installé. Vous devez aller dans le répertoire site-packages, extraire le .egg, puis déplacez-le dans un fichier caché (ou le supprimer, ou autre).
Voici un exemple de ce que je l'ai fait pour désactiver le module MySQLdb de fichier .egg qui a été à l'origine de cette erreur lorsque le script python était exécuté à partir 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
le droit de Phillip B Oldham. Vous pouvez ajouter ces lignes dans votre code:
import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory
Une solution simple serait de créer le répertoire et fournir un accès www-data
à lui.
$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs