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

Était-ce utile?

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:

  1. 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.
  2. Créez un répertoire global pour dézipper (par exemple. /tmp/python-eggs) et définir l'environnement PYTHON_EGG_CACHE variables dans ce répertoire.
  3. A l'aide du commutateur de -Z lors de l'utilisation easy_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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top