Что такое кеш яиц 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
(находится в домашнем каталоге пользователя). Если этого не существует, это вызывает проблемы при попытке запуска приложений.
Есть ряд исправлений:
- Создать
.python-eggs
каталог в домашнем каталоге пользователя и сделать его доступным для записи для пользователя. - Создайте глобальный каталог для разархивирования (например,
/tmp/python-eggs
) и установите переменную средыPYTHON_EGG_CACHE
в этот каталог. - Использовать
-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)