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

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

Не могу извлечь файл (ы) в кеш яиц

Следующая ошибка произошла при попытке извлечь файл (ы) в кеш Python:

[Errno 13] В доступе отказано: '/var/www/.python-eggs'

Каталог кеша Python в настоящее время установлен на:

/var/www/.python-eggs

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

В документации по Python ничего нет, так что я немного растерялся относительно рекомендаций о том, где разместить этот каталог и для чего он используется.

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

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

9 ответов

Решение

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

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

Есть ряд исправлений:

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

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

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

export PYTHON_EGG_CACHE=/some/other/dir

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

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

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

Они хранятся в /site-packages/ реж.

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

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

Так что вы можете

  • задавать PYTHON_EGG_DIR в /tmpили

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

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

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

Вот пример того, что я сделал, чтобы отключить файл.egg модуля MySQLdb, который вызывал эту ошибку при запуске скрипта python из Zabbix.

cd /usr/local/lib/python2.7/site-packages
распакуйте 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

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

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

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

Я получил эту ошибку в 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's it. The command now works and creates a new file in there. (Haven't tested if I need to do this every time.)

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

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

добавление этого в начало моего исходного файла до того, как будет работать импорт

      import os
xyz = os.path.join('~', 'Documents', '.cache')
os.environ['PYTHON_EGG_CACHE'] = os.path.expanduser(xyz)
Другие вопросы по тегам