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-packages
Verzeichnis unterscheidet, in dem Python Eier speichert (so wie ich es verstehe)?
quelle
/var/www/.python-eggs
standardmäßig eingestellt ist und nicht irgendwo standardmäßigerDer 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:
Möglicherweise müssen Sie es in Ihrer Apache-Umgebung festlegen, wenn Sie eine Webanwendung verwenden.
quelle
Dies ist ein dunkler Nebeneffekt der Verwendung eines ansonsten schönen Eiermechanismus.
Eier sind Pakete (ein Verzeichnis voller Dateien), die in eine
.egg
Datei gepackt sind , um die Depolymentierung zu vereinfachen.Sie werden in
/site-packages/
dir gespeichert .Solange die im Ei gespeicherten
.py
Dateien 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
.so
zufä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_DIR
zu/tmp
, oderGeben Sie dem Benutzer die
www
Schreibberechtigung/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).
quelle
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.
quelle
.egg
mit PyODBC bekommen, nur eine.egg-info
und.so
MySQL_python-1.2.3-py2.7-linux-x86_64.egg
zu.MySQL_python-1.2.3-py2.7-linux-x86_64.egg
verschieben, die entpackteEGG-INFO
Datei nachMySQL_python-1.2.3-py2.7-linux-x86_64.egg-info
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.
quelle
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
quelle
Eine einfache Lösung wäre, das Verzeichnis zu erstellen und
www-data
Zugriff darauf zu gewähren .quelle
Ich habe diesen Fehler in Django erhalten, als ich den folgenden Befehl zum ersten Mal ausgeführt habe.
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.)
quelle