Подтвердить что ты не робот

Что такое кеш яиц Python (PYTHON_EGG_CACHE)?

Я только что обновил с Python 2.6.1 до 2.6.4 на моей машине разработки и после запуска python script было представлено следующее сообщение:

Не удается извлечь файл в кеш-кеш

Произошла следующая ошибка: пытаясь извлечь файл в Кэш яйца Python:

[Errno 13] Разрешение отклонено: '/var/www/.python-eggs'

Каталог кэша яиц Python в настоящее время установлено значение:

/var/www/.python-eggs

Возможно, у вашей учетной записи нет написать доступ к этому каталогу? Вы может изменить каталог кэша на установка PYTHON_EGG_CACHE переменной окружения, чтобы указать на доступный каталог.

В python docs ничего не существует, поэтому я немного потеряю информацию о лучших практиках, где каталог и то, для чего он использовался.

Может кто-нибудь объяснить, что такое кеш яйца Python?

Также вы можете объяснить, почему/как он отличается от каталога site-packages, который использует Python для хранения яиц (как я понимаю)?

4b9b3361

Ответ 1

Из моих исследований выясняется, что некоторые яйца упакованы в виде zip файлов и сохраняются как таковые в каталоге Python site-packages.

Эти отложенные яйца необходимо распаковать до того, как их можно будет выполнить, поэтому они будут расширены в каталог PYTHON_EGG_CACHE, который по умолчанию - ~/.python-eggs (находится в домашнем каталоге пользователя). Если этого не существует, это вызывает проблемы при попытке запуска приложений.

Существует ряд исправлений:

  • Создайте каталог .python-eggs в домашнем каталоге пользователя и сделайте его доступным для записи для пользователя.
  • Создайте глобальный каталог для распаковки (например, /tmp/python-eggs) и установите переменную среды PYTHON_EGG_CACHE в этот каталог.
  • Используйте переключатель -Z при использовании easy_install, чтобы разархивировать пакет при установке.

Ответ 2

Кэш яиц python - это просто каталог, используемый setuptools для хранения установленных пакетов, соответствующих спецификации . Вы можете прочитать здесь setuptools.

Кроме того, как указано в сообщении об ошибке, вы можете указать другой каталог кеша яйца в своей среде, установив PYTHON_EGG_CACHE =/some/other/dir. Самый простой способ сделать это - установить его в ~/.bash_profile (при условии, что вы используете bash), например:

export PYTHON_EGG_CACHE=/some/other/dir

Возможно, вам придется установить его в своей среде Apache, если вы используете веб-приложение.

Ответ 3

Это темный побочный эффект использования иначе красивого механизма яиц.

Яйца - это пакеты (каталог, полный файлов), упакованный в один файл .egg, чтобы упростить деполяцию.

Они хранятся в каталоге /site-packages/.

Пока файлы, хранящиеся в яйце, являются .py файлами, он отлично работает. Импорт Python может импортировать объекты из любого файлового объекта, как обычный файл.

Но когда происходит что-то вроде .so, python не может объяснить базовой ОС, что он хочет загрузить библиотеку, которая не имеет физического имени. И единственные обходные пути, которые, по мнению авторов, были распакованы в временную директорию. Естественно, это не /site-packages/, поскольку /site-packages/ недоступен для обычных пользователей.

Итак, вы можете

  • установите PYTHON_EGG_DIR в /tmp или

  • предоставить пользователю www разрешение на запись /var/www/.python-eggs
    (чтобы файлы не распаковывались каждый раз при очистке /tmp ) или лучше, чем

  • распакуйте яйцо, как это было предложено @shalley303
    (и избегать разархивирования яйца во время выполнения).

Ответ 4

Яйца Python представляют собой zip-сжатые пакеты, содержащие как модули Python, так и метаданные. Кэш яиц - это место, где извлеченное содержимое яйца хранится так, чтобы содержащиеся внутри него модули Python были полезны.

Ответ 5

Вы также можете отключить использование .egg после его установки. Вам нужно зайти в каталог сайтов-пакетов, извлечь .egg, а затем переместить его в скрытый файл (или удалить его или что-то еще).

Вот пример того, что я сделал, чтобы отключить файл .egg модуля MySQLdb, который вызывал эту ошибку, когда python script запускался из 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

Ответ 6

Филлип Б Олдхэм прав. Вы можете добавить эти строки в свой код:

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

Ответ 7

Простым решением было бы создать каталог и предоставить www-data доступ к нему.

$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs

Ответ 8

Я получил эту ошибку в Django при первом запуске приведенной ниже команды.

python manage.py sql myproject

Я заставил его работать так:

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 it. The command now works and creates a new file in there. (Haven't tested if I need to do this every time.)