Frage

Ich bin gerade von Python 2.6.1 bis 2.6.4 auf meiner Entwicklungsmaschine aufgerüstet und beim Starten eines Python-Skript wurde mit der folgenden Meldung dargestellt:

  

Kann nicht Datei (en) extrahieren Ei Cache

     

Der folgende Fehler trat bei   versuchen zu extrahieren Datei (en) auf dem   Python Ei-Cache:

     

[Errno 13] Erlaubnis verweigert:   '/Var/www/.python-eggs'

     

Das Verzeichnis Python Ei-Cache   zur Zeit auf:

     

/var/www/.python-eggs

     

Vielleicht ist Ihr Konto nicht   Schreibzugriff auf dieses Verzeichnis? Du   kann das Cache-Verzeichnis ändern, indem   Einstellen des PYTHON_EGG_CACHE   Umgebungsvariable Punkt zu einem   zugängliches Verzeichnis.

Es gibt nichts in der Python docs so ich bin an einem bisschen einen Verlust in Bezug auf best Practices auf dem dieses Verzeichnis zu setzen und was es verwendet für.

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

Sie können aber auch erklären, warum / wie es das site-packages Verzeichnis Python Anwendungen zu speichern Eier unterschiedlich ist (wie ich es verstehe)?

War es hilfreich?

Lösung

Aus meiner Untersuchungen stellt sich heraus, dass einige Eier als Zip-Dateien verpackt werden, und sind als solche in Python site-packages Verzeichnis gespeichert.

Diese müssen gezippt Eier dekomprimiert werden, bevor sie ausgeführt werden können, so erweitert werden, in das PYTHON_EGG_CACHE Verzeichnis, das standardmäßig ~/.python-eggs (befindet sich im Home-Verzeichnis des Benutzers). Wenn dies nicht existiert es Probleme verursacht, wenn Anwendungen ausführen möchten.

Es gibt eine Reihe von Korrekturen:

  1. Erstellen Sie ein .python-eggs Verzeichnis im Home-Verzeichnis des Benutzers und macht es für den Benutzer beschreibbar.
  2. Erstellen Sie ein weltweites Verzeichnis für Entpacken (zB. /tmp/python-eggs) und die Umgebungsvariable PYTHON_EGG_CACHE auf dieses Verzeichnis gesetzt.
  3. Verwenden Sie den -Z Schalter, wenn easy_install mit dem Paket entpacken, bei der Installation.

Andere Tipps

Der Python-Ei-Cache ist einfach ein Verzeichnis, das von Setuptool zum Speichern von Paketen installiert und verwendet werden, die href="http://peak.telecommunity.com/DevCenter/EggFormats" rel="noreferrer"> Ei-Spezifikation an die . Sie können Lesen Sie mehr über Setuptools hier .

Darüber hinaus, da die Fehlermeldung besagt, können Sie ein anderes Ei-Cache-Verzeichnis in Ihrer Umgebung angeben, indem PYTHON_EGG_CACHE = / some / other / Richt. Der einfachste Weg dies zu tun ist, um es einrichten in Ihrer ~ / .bash_profile (vorausgesetzt, Sie verwenden bash), wie folgt aus:

export PYTHON_EGG_CACHE=/some/other/dir

Sie können es einstellen müssen in Ihrer Umgebung Apache, wenn Sie eine Web-Anwendung verwenden.

Dies ist ein dunkler Nebeneffekt der ansonsten schöne Eier Mechanismus.

Eier sind Pakete (ein Verzeichnis voller Dateien), gepackt in eine .egg Datei zu vereinfachen depolyment.

Sie werden in /site-packages/ dir gespeichert.

Solange die gespeicherten Dateien im Ei sind .py Dateien es funktioniert super. Python Import kann die Dinge aus einer beliebigen Datei-ähnliches Objekt importieren wie es eine normale Datei war.

Aber wenn so etwas wie .so dort fallen geschieht, Python kann auf das darunter liegende Betriebssystem nicht erklären, dass sie will eine Bibliothek laden, die keinen physischen Namen haben. Und die einzige Lösung distutils Autoren gedacht, wird es in ein temporäres Verzeichnis entpacken. Natürlich ist es nicht /site-packages/ da /site-packages/ für normale Benutzer nicht beschreibbar ist.

So können Sie entweder

  • set PYTHON_EGG_DIR zu /tmp, oder

  • Geben Benutzer www Schreibberechtigung für /var/www/.python-eggs
    (So, dass die Dateien werden nicht jedes Mal / tmp entpackt wird gereinigt) oder besser als

  • entpacken Sie das Ei wie von @ shalley303
    (Und vermeiden Sie in der Laufzeit insgesamt aus dem Ei unzipping).

Python Eier sind zip-komprimierte Pakete sowohl von Python-Modulen und Metadaten enthalten. Die Ei-Cache ist, wo die der extrahierten Inhalt des Eies gespeichert werden, so dass das Python-Module innerhalb enthalten sind verwendbar.

Sie können auch die Verwendung der .egg deaktivieren, nachdem es installiert wurde. Sie müssen in die Website-Pakete Verzeichnis gehen, extrahieren Sie die .egg, und es dann zu einer versteckten Datei verschieben (oder löschen, oder was auch immer).

Hier ist ein Beispiel dafür, was ich tat die MySQLdb Modul .egg Datei zu deaktivieren, die diesen Fehler verursacht wurden, wenn das Python-Skript von Zabbix ausgeführt wurde.

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 hat Recht. Sie können diese Zeilen im Code hinzufügen:

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

Eine einfache Lösung wäre, das Verzeichnis zu erstellen und www-data zugänglich zu machen.

$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top