web-dev-qa-db-fra.com

Qu'est-ce que le cache d'oeufs Python (PYTHON_Egg_CACHE)?

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)?

70
Phillip B Oldham

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:

  1. Créez un répertoire .python-eggs dans le répertoire de base de l'utilisateur et créez-le en écriture pour l'utilisateur.
  2. Créez un répertoire global pour décompresser (par exemple, /tmp/python-eggs) et définissez la variable d'environnement PYTHON_Egg_CACHE sur ce répertoire.
  3. Utilisez le commutateur -Z lorsque vous utilisez easy_install pour décompresser le package lors de l'installation.
66
Phillip B Oldham

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.

30
AJ.

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).

12
Antony Hatchkins

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.

3

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 
3
shalley303

Phillip B Oldham a raison. Vous pouvez ajouter ces lignes dans votre code:

import os  
os.environ['PYTHON_Egg_CACHE'] = '/tmp' # a writable directory 
1
Codefor

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
0
Bilal Baqar