O que é o cache do ovo python (python_egg_cache)?
-
25-09-2019 - |
Pergunta
Acabei de atualizar do Python 2.6.1 para 2.6.4 na minha máquina de desenvolvimento e, ao iniciar um script python, foi apresentado a seguinte mensagem:
Não é possível extrair arquivos para cache do ovo
O seguinte erro ocorreu ao tentar extrair arquivos para o cache do ovo Python:
ERRNO 13] Permissão negada: '/var/www/.python-eggs'
O diretório Python Egg Cache está atualmente definido como:
/var/www/.python-eggs
Talvez sua conta não tenha acesso a este diretório? Você pode alterar o diretório de cache definindo a variável de ambiente python_egg_cache para apontar para um diretório acessível.
Não há nada no Python Docs Então, estou uma perda em relação às melhores práticas sobre onde colocar este diretório e para que é usado.
Alguém pode explicar o que é o cache do ovo python?
Além disso, você pode explicar por que/como é diferente do site-packages
O diretório Python usa para armazenar ovos (como eu o entendo)?
Solução
A partir das minhas investigações, alguns ovos são embalados como arquivos zip e são salvos como tal no Python's site-packages
diretório.
Esses ovos com zíper precisam ser descompactados antes que possam ser executados; portanto, são expandidos para o PYTHON_EGG_CACHE
diretório que por padrão é ~/.python-eggs
(localizado no diretório inicial do usuário). Se isso não existir, causa problemas ao tentar executar aplicativos.
Existem várias correções:
- Crie um
.python-eggs
Diretório no diretório inicial do usuário e o torne por gravidade para o usuário. - Crie um diretório global para descompactar (por exemplo.
/tmp/python-eggs
) e defina a variável de ambientePYTHON_EGG_CACHE
para este diretório. - Use o
-Z
alterne ao usareasy_install
Para descompactar o pacote ao instalar.
Outras dicas
O cache do ovo python é simplesmente um diretório usado pelo setupTools para armazenar pacotes instalados que estão em conformidade com o Especificação de ovos. Você pode Leia mais sobre o SetupTools aqui.
Além disso, como afirma a mensagem de erro, você pode especificar um diretório de cache de ovo diferente em seu ambiente, configurando python_egg_cache =/alguns/outros/dir. A maneira mais fácil de fazer isso é defini -lo no seu ~/.bash_profile (assumindo que você está usando o Bash), assim:
export PYTHON_EGG_CACHE=/some/other/dir
Pode ser necessário defini -lo em seu ambiente Apache se você estiver usando um aplicativo da Web.
Este é um efeito colateral escuro de usar o mecanismo de ovos agradáveis.
Ovos são pacotes (um diretório cheio de arquivos) embalados em um .egg
arquivo para simplificar o depoliamento.
Eles são armazenados em /site-packages/
dir.
Contanto que os arquivos armazenados no ovo sejam .py
arquivos funciona muito bem. A importação do Python pode importar coisas de qualquer objeto semelhante a um arquivo, assim como era um arquivo comum.
Mas quando algo como .so
Acontece que o Python não pode explicar ao sistema operacional subjacente que deseja carregar uma biblioteca que não tem um nome físico. E a única solução alternativa que os autores de Distutils pensaram é abranger -lo em um diretor temporário. Naturalmente não é /site-packages/
desde /site-packages/
não é gravável para usuários comuns.
Então você pode
definir
PYTHON_EGG_DIR
para/tmp
, oudar usuário
www
Escreva permissão para/var/www/.python-eggs
(para que os arquivos não sejam descompactados toda vez /TMP é limpo) ou melhor entãodescompacte o ovo, conforme sugerido por @shalley303
(e evite descompactar o ovo no tempo de execução).
Os ovos de Python são pacotes compactados por ZIP, contendo módulos Python e metadados. O cache do ovo é onde o conteúdo extraído do ovo é armazenado para que os módulos Python contidos sejam utilizados.
Você também pode desativar o uso do .EGG depois de instalado. Você precisa entrar no diretório de pacotes do site, extrair o .egg e movê-lo para um arquivo oculto (ou excluí-lo ou o que for).
Aqui está um exemplo do que eu fiz para desativar o arquivo .EGG do módulo MySQLDB, que estava causando esse erro quando o script python estava sendo executado no 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
Phillip B Oldham direito. Você pode adicionar estas linhas em seu código:
import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory
Uma correção simples seria criar o diretório e fornecer www-data
acesso a ele.
$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs