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)?

Foi útil?

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:

  1. Crie um .python-eggs Diretório no diretório inicial do usuário e o torne por gravidade para o usuário.
  2. Crie um diretório global para descompactar (por exemplo. /tmp/python-eggs) e defina a variável de ambiente PYTHON_EGG_CACHE para este diretório.
  3. Use o -Z alterne ao usar easy_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, ou

  • dar 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ão

  • descompacte 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top