Je viens de mettre à niveau de Python 2.6.1 à 2.6.4 sur ma machine de développement et au démarrage d'un script python, le message suivant a été présenté:
Impossible d'extraire le (s) fichier (s) dans le cache des oeufs
L'erreur suivante s'est produite pendant que essayer d'extraire le (s) fichier (s) dans le fichier Cache Oeuf Python:
[Errno 13] Autorisation refusée: '/var/www/.python-eggs'
Le répertoire de cache de Python Egg est actuellement réglé sur:
/var/www/.python-eggs
Peut-être que votre compte n'a pas accès en écriture à ce répertoire? Vous peut changer le répertoire de cache par réglage de PYTHON_Egg_CACHE variable d'environnement pour pointer vers un répertoire accessible.
Il n'y a rien dans la documentation python , donc je suis un peu perdue en ce qui concerne les meilleures pratiques concernant l'emplacement de ce répertoire et son utilisation.
Quelqu'un peut-il expliquer ce qu'est le cache de Python Egg?
Aussi, pouvez-vous expliquer pourquoi/en quoi il est différent du répertoire site-packages
utilisé par Python pour stocker les œufs (si je comprends bien)?
Il ressort de mes investigations que certains œufs sont conditionnés en fichiers Zip et sont enregistrés comme tels dans le répertoire site-packages
de Python.
Ces œufs compressés doivent être décompressés avant de pouvoir être exécutés. Ils sont donc développés dans le répertoire PYTHON_Egg_CACHE
qui est par défaut ~/.python-eggs
(situé dans le répertoire de base de l'utilisateur). Si cela n'existe pas, cela pose des problèmes lorsque vous essayez d'exécuter des applications.
Il y a un certain nombre de corrections:
.python-eggs
dans le répertoire de base de l'utilisateur et créez-le en écriture pour l'utilisateur./tmp/python-eggs
) et définissez la variable d'environnement PYTHON_Egg_CACHE
sur ce répertoire.-Z
lorsque vous utilisez easy_install
pour décompresser le package lors de l'installation.Le cache python Egg est simplement un répertoire utilisé par setuptools pour stocker les packages installés conformes à la spécification Egg . Vous pouvez en savoir plus sur setuptools ici .
En outre, comme l'indique le message d'erreur, vous pouvez spécifier un autre répertoire de cache Egg dans votre environnement en définissant PYTHON_Egg_CACHE =/some/other/dir. Le moyen le plus simple de le faire est de le définir dans votre ~/.bash_profile (en supposant que vous utilisez bash), comme ceci:
export PYTHON_Egg_CACHE=/some/other/dir
Vous devrez peut-être le configurer dans votre environnement Apache si vous utilisez une application Web.
Ceci est un effet secondaire sombre de l’utilisation du mécanisme par d’autres œufs.
Les œufs sont des paquets (un répertoire de fichiers) regroupés dans un seul fichier .Egg
afin de simplifier le dépôt.
Ils sont stockés dans /site-packages/
dir.
Tant que les fichiers stockés dans Egg sont des fichiers .py
, cela fonctionne très bien. L'importation Python peut importer des éléments de n'importe quel objet de type fichier, comme s'il s'agissait d'un fichier ordinaire.
Mais lorsque quelque chose comme .so
arrive ici, python ne peut pas expliquer au système d'exploitation sous-jacent qu'il veut charger une bibliothèque qui n'a pas de nom physique. Et la seule solution de contournement à laquelle les auteurs ont pensé est de la décompresser dans un répertoire temporaire. Naturellement, ce n'est pas /site-packages/
puisque /site-packages/
n'est pas accessible en écriture pour les utilisateurs ordinaires.
Donc vous pouvez soit
mettre PYTHON_Egg_DIR
à /tmp
, ou
donner à l'utilisateur www
l'autorisation d'écriture sur /var/www/.python-eggs
(afin que les fichiers ne soient pas décompressés à chaque fois que/tmp est nettoyé) ou mieux alors
décompressez l'oeuf comme suggéré par @ shalley303
(et évitez de décompresser l’Oeuf dans le temps d’exécution).
Les œufs Python sont des packages Zip-compressés contenant des modules Python et des métadonnées. Le cache des œufs est l'endroit où le contenu extrait de l'œuf est stocké afin que les modules Python qu'il contient puissent être utilisés.
Vous pouvez également désactiver l'utilisation du .Egg après son installation. Vous devez aller dans le répertoire site-packages, extraire le .Egg, puis le déplacer dans un fichier caché (ou le supprimer, ou autre).
Voici un exemple de ce que j'ai fait pour désactiver le fichier .Egg du module MySQLdb qui était à l'origine de cette erreur lorsque le script python était exécuté à partir de 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
Phillip B Oldham a raison. Vous pouvez ajouter ces lignes dans votre code:
import os
os.environ['PYTHON_Egg_CACHE'] = '/tmp' # a writable directory
Une solution simple consisterait à créer le répertoire et à lui donner un accès www-data
.
$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs