¿Cuál es el caché de huevos de Python(PYTHON_EGG_CACHE)?
python-egg-cache (7)
Acabo de actualizar de Python 2.6.1 a 2.6.4 en mi máquina de desarrollo y al iniciar una secuencia de comandos python se presentó el siguiente mensaje:
No se puede extraer el archivo (s) a la memoria caché de huevos
Se produjo el siguiente error al intentar extraer archivo (s) a la memoria caché de Python:
[Errno 13] Permiso denegado: ''/var/www/.python-eggs''
El directorio Python de caché de huevos está actualmente configurado para:
/var/www/.python-eggs
Tal vez su cuenta no tiene acceso de escritura a este directorio? Puede cambiar el directorio de caché configurando la variable de entorno PYTHON_EGG_CACHE para que apunte a un directorio accesible.
No hay nada en los documentos de Python, así que estoy un poco perdido con respecto a las mejores prácticas sobre dónde colocar este directorio y para qué se usa.
¿Alguien puede explicar qué es el caché de huevos de Python?
Además, ¿puede explicar por qué / cómo es diferente al directorio de site-packages
Python usa para almacenar huevos (según tengo entendido)?
De mis investigaciones resulta que algunos huevos se empaquetan como archivos zip y se guardan como tales en el directorio de site-packages
de site-packages
de Python.
Estos huevos comprimidos deben descomprimirse antes de que se puedan ejecutar, por lo que se expanden en el directorio PYTHON_EGG_CACHE
, que de forma predeterminada es ~/.python-eggs
(ubicado en el directorio de inicio del usuario). Si esto no existe, causa problemas al intentar ejecutar aplicaciones.
Hay una serie de soluciones:
- Cree un directorio
.python-eggs
en el directorio de inicio del usuario y.python-eggs
escribible para el usuario. - Cree un directorio global para descomprimir (p. Ej.,
/tmp/python-eggs
) y establezca la variable de entornoPYTHON_EGG_CACHE
en este directorio. - Use el
easy_install
-Z
cuando useeasy_install
para descomprimir el paquete durante la instalación.
El caché de huevos python es simplemente un directorio utilizado por las herramientas de configuración para almacenar los paquetes instalados que cumplen con la especificación del huevo . Puede leer más sobre setuptools aquí .
Además, como indica el mensaje de error, puede especificar un directorio de caché de huevos diferente en su entorno configurando PYTHON_EGG_CACHE = / some / other / dir. La forma más fácil de hacer esto es configurarlo en su ~ / .bash_profile (suponiendo que esté usando bash), así:
export PYTHON_EGG_CACHE=/some/other/dir
Es posible que deba configurarlo en su entorno Apache si está utilizando una aplicación web.
Este es un efecto secundario oscuro de usar un mecanismo de huevos que de otro modo sería bueno.
Los huevos son paquetes (un directorio lleno de archivos) empacados en un .egg
archivo .egg
para simplificar el .egg
.
Se almacenan en /site-packages/
dir.
Siempre que los archivos almacenados en el huevo sean archivos .py
, funciona de maravilla. La importación de Python puede importar elementos desde cualquier objeto similar a un archivo como si fuera un archivo ordinario.
Pero cuando sucede algo así como, por ejemplo, Python no puede explicar al sistema operativo subyacente que quiere cargar una biblioteca que no tiene un nombre físico. Y la única solución que los autores de distutils han pensado es descomprimirla en un directorio temporal. Naturalmente, no es /site-packages/
since /site-packages/
no se puede escribir para los usuarios normales.
Entonces puedes
establecer
PYTHON_EGG_DIR
en/tmp
, ootorgar permiso de escritura al usuario
www
a/var/www/.python-eggs
(para que los archivos no se descompriman cada vez / tmp se limpia) o mejordescomprimir el huevo como lo sugiere @ shalley303
(y evite descomprimir el huevo en el tiempo de ejecución por completo).
Los Python eggs son paquetes zip-compressed que contienen tanto módulos de Python como metadatos. El caché de huevos es donde se almacenan los contenidos extraídos del huevo para que los módulos de Python que contiene sean utilizables.
Phillip B Oldham tiene razón. Puede agregar estas líneas en su código:
import os
os.environ[''PYTHON_EGG_CACHE''] = ''/tmp'' # a writable directory
También puede desactivar el uso de .egg después de que se haya instalado. Debe ir al directorio de paquetes de sitio, extraer el .egg y luego moverlo a un archivo oculto (o eliminarlo, o lo que sea).
Aquí hay un ejemplo de lo que hice para desactivar el archivo .egg del módulo MySQLdb que estaba causando este error cuando el script de python se estaba ejecutando desde 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
Una solución simple sería crear el directorio y proporcionarle acceso a www-data
.
$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs