Was ist der Python-Eiercache (PYTHON_EGG_CACHE)?

74

Ich habe gerade ein Upgrade von Python 2.6.1 auf 2.6.4 auf meinem Entwicklungscomputer durchgeführt und beim Starten eines Python-Skripts wurde die folgende Meldung angezeigt:

Datei (en) können nicht in den Eiercache extrahiert werden

Der folgende Fehler ist beim Versuch aufgetreten, Dateien in den Python-Ei-Cache zu extrahieren:

[Errno 13] Berechtigung verweigert: '/var/www/.python-eggs'

Das Python-Ei-Cache-Verzeichnis ist derzeit auf Folgendes festgelegt:

/var/www/.python-eggs

Möglicherweise hat Ihr Konto keinen Schreibzugriff auf dieses Verzeichnis? Sie können das Cache-Verzeichnis ändern, indem Sie die Umgebungsvariable PYTHON_EGG_CACHE so einstellen, dass sie auf ein zugängliches Verzeichnis verweist.

In den Python-Dokumenten ist nichts enthalten, daher bin ich etwas ratlos in Bezug auf Best Practices, wo dieses Verzeichnis abgelegt werden soll und wofür es verwendet wird.

Kann jemand erklären, was der Python-Eier-Cache ist?

Können Sie auch erklären, warum / wie es sich von dem site-packagesVerzeichnis unterscheidet, in dem Python Eier speichert (so wie ich es verstehe)?

Phillip B. Oldham
quelle

Antworten:

67

Aus meinen Untersuchungen geht hervor, dass einige Eier als Zip-Dateien verpackt und als solche im Python- site-packagesVerzeichnis gespeichert sind .

Diese gezippten Eier müssen entpackt werden, bevor sie ausgeführt werden können. Sie werden daher in das PYTHON_EGG_CACHEVerzeichnis erweitert, das sich standardmäßig im Ausgangsverzeichnis ~/.python-eggsdes Benutzers befindet. Wenn dies nicht vorhanden ist, treten Probleme beim Ausführen von Anwendungen auf.

Es gibt eine Reihe von Korrekturen:

  1. Erstellen Sie ein .python-eggsVerzeichnis im Ausgangsverzeichnis des Benutzers und machen Sie es für den Benutzer beschreibbar.
  2. Erstellen Sie ein globales Verzeichnis zum Entpacken (z. B. /tmp/python-eggs) und setzen Sie die Umgebungsvariable PYTHON_EGG_CACHEauf dieses Verzeichnis.
  3. Verwenden Sie den -ZSchalter, wenn easy_installSie das Paket bei der Installation entpacken möchten.
Phillip B. Oldham
quelle
7
Python kann auf Dateien in ZIP-Dateien zugreifen. Sie müssen nur extrahiert werden, wenn die Anwendung einen Dateinamen anstelle eines dateiähnlichen Objekts für eine Ressource (oder ein Verzeichnis) in einem Ei wünscht. Dies geschieht normalerweise bei Webservern und dergleichen.
Wump
2
Erwähnenswert ist auch, dass .python -ggs Ihre Umask übernimmt, ohne dem Verzeichnis Ausführungsberechtigungen hinzuzufügen. Auf Verzeichnisse kann ohne Ausführungsberechtigung nicht zugegriffen werden, daher wird der gleiche Fehler wie oben angezeigt.
Joedborg
1
Ich frage mich, warum es /var/www/.python-eggsstandardmäßig eingestellt ist und nicht irgendwo standardmäßiger
aussieht
2
+1 für Option 3. Das hat mich heute stundenlang nervt. Die Verwendung von easy_install mit der Option -Z löste mein Problem in Sekunden. Easy_install, es ist nicht so einfach.
Dennis Bauszus
30

Der Python - Ei - Cache ist einfach ein Verzeichnis , das von Setuptool zum Speichern von Paketen installiert und verwendet werden, die den entsprechen , Ei - Spezifikation . Sie können hier mehr über Setuptools lesen .

Wie in der Fehlermeldung angegeben, können Sie außerdem ein anderes Ei-Cache-Verzeichnis in Ihrer Umgebung angeben, indem Sie PYTHON_EGG_CACHE = / some / other / dir festlegen. Der einfachste Weg, dies zu tun, besteht darin, es in Ihrem ~ / .bash_profile festzulegen (vorausgesetzt, Sie verwenden bash), wie folgt:

export PYTHON_EGG_CACHE=/some/other/dir

Möglicherweise müssen Sie es in Ihrer Apache-Umgebung festlegen, wenn Sie eine Webanwendung verwenden.

AJ.
quelle
Ich habe eine fehlende Umgebungsvariable im Webserver von Google App Engine behoben, indem ich app.yaml wie folgt bearbeitet habe: env_variables: PYTHON_EGG_CACHE: 'C: \ Python27 \ Lib \ site-packages' stackoverflow.com/questions/31122337/…
dbasch
12

Dies ist ein dunkler Nebeneffekt der Verwendung eines ansonsten schönen Eiermechanismus.

Eier sind Pakete (ein Verzeichnis voller Dateien), die in eine .eggDatei gepackt sind , um die Depolymentierung zu vereinfachen.

Sie werden in /site-packages/dir gespeichert .

Solange die im Ei gespeicherten .pyDateien Dateien sind, funktioniert es hervorragend. Der Python-Import kann Dinge aus jedem dateiähnlichen Objekt importieren, so als wäre es eine gewöhnliche Datei.

Aber wenn so etwas .sozufällig vorbeikommt, kann Python dem zugrunde liegenden Betriebssystem nicht erklären, dass es eine Bibliothek laden möchte, die keinen physischen Namen hat. Und die einzige Problemumgehung, an die Autoren gedacht haben, ist das Entpacken in ein temporäres Verzeichnis. Natürlich ist es nicht, /site-packages/da /site-packages/es für normale Benutzer nicht beschreibbar ist.

Das kannst du auch

  • eingestellt PYTHON_EGG_DIRzu /tmp, oder

  • Geben Sie dem Benutzer die wwwSchreibberechtigung /var/www/.python-eggs
    (damit die Dateien nicht jedes Mal entpackt werden, wenn / tmp bereinigt wird) oder besser

  • Entpacken Sie das Ei wie von @ shalley303 vorgeschlagen
    (und vermeiden Sie das Entpacken des Eies zur Laufzeit insgesamt).

Antony Hatchkins
quelle
3

Sie können die Verwendung der .egg-Datei auch nach der Installation deaktivieren. Sie müssen in das Verzeichnis site-packages gehen, die .egg-Datei extrahieren und sie dann in eine versteckte Datei verschieben (oder löschen oder was auch immer).

Hier ist ein Beispiel dafür, wie ich die .egg-Datei des MySQLdb-Moduls deaktiviert habe, die diesen Fehler verursacht hat, als das Python-Skript von Zabbix ausgeführt wurde.

cd /usr/local/lib/python2.7/site-packages
Entpacken Sie 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
shalley303
quelle
Ich glaube nicht, dass Sie eine .eggmit PyODBC bekommen, nur eine .egg-infound.so
joedborg
Dies funktioniert für mich, wenn ich anstatt MySQL_python-1.2.3-py2.7-linux-x86_64.eggzu .MySQL_python-1.2.3-py2.7-linux-x86_64.eggverschieben, die entpackte EGG-INFODatei nachMySQL_python-1.2.3-py2.7-linux-x86_64.egg-info
Mike Dacre
3

Python-Eier sind zip-komprimierte Pakete, die sowohl Python-Module als auch Metadaten enthalten. Im Eiercache wird der extrahierte Inhalt des Eies gespeichert, sodass die darin enthaltenen Python-Module verwendet werden können.

Ignacio Vazquez-Abrams
quelle
1

Phillip B Oldham hat recht. Sie können diese Zeilen in Ihren Code einfügen:

import os  
os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory 
Codefor
quelle
0

Eine einfache Lösung wäre, das Verzeichnis zu erstellen und www-dataZugriff darauf zu gewähren .

$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs
Bilal Baqar
quelle
0

Ich habe diesen Fehler in Django erhalten, als ich den folgenden Befehl zum ersten Mal ausgeführt habe.

python manage.py sql myproject

Ich habe es so gemacht:

1. In Explorer, view the folder that the error says egg cache directory is set to
2. Delete (or rename) the file mysql_python-1.2.5-py2.7-win32.egg-tmp
3. That's it. The command now works and creates a new file in there. (Haven't tested if I need to do this every time.)
user984003
quelle