Что такое кэш яичка Python (python_egg_cache)?
-
25-09-2019 - |
Вопрос
Я только что обновил из Python 2.6.1 до 2.6.4 на мою машину для разработки и при запуске сценария Python был представлен следующее сообщение:
Не могу извлечь файл (ы) в кэш яиц
Произошла следующая ошибка при попытке извлечения файлов (ы) в кэш яйца Python:
Errno 13] Разрешение запрещено: '/var/www/.python-eggs
Каталог кеша Python Egg в настоящее время устанавливается:
/var/www/.python-eggs.
Возможно, ваша учетная запись не имеет доступа к записи в этот каталог? Вы можете изменить каталог кэша, установив переменную среды Python_egg_cache, чтобы указать на доступный каталог.
В Python Docs. Таким образом, я немного потерей в отношении лучших практик, где поставить этот каталог и то, для чего он используется.
Может кто-нибудь объяснить, что такое кэш яиц для питона?
Кроме того, вы можете объяснить, почему / как он отличается от site-packages
Каталог Python использует для хранения яиц (как я понимаю)?
Решение
Из моих исследований оказывается, что некоторые яйца упакованы в виде Zip-файлов, и сохраняются как таковые в Python's site-packages
каталог.
Эти яйца на молнии должны быть расставлены до того, как они могут быть выполнены, поэтому расширяются в PYTHON_EGG_CACHE
каталог, который по умолчанию ~/.python-eggs
(Расположен в домашнем каталоге пользователя). Если это не существует, это вызывает проблемы при попытке запуска приложений.
Есть ряд исправлений:
- Создать
.python-eggs
каталог в домашнем каталоге пользователя и сделать его записи для пользователя. - Создайте глобальный каталог для расстепения (например,
/tmp/python-eggs
) и установите переменную средыPYTHON_EGG_CACHE
в этот каталог. - Использовать
-Z
Переключатель при использованииeasy_install
расстегнуть пакет при установке.
Другие советы
Кеш для яиц Python - это просто каталог, используемый SetUpeWools для хранения установленных пакетов, который соответствует Спецификация яйца. Отказ Ты сможешь Узнайте больше о Seturgools здесь.
Кроме того, в качестве сообщения об ошибке предусматривают, вы можете указать другой каталог Cache Cache яйца, установив Python_egg_cache = / ue / out / dir. Самый простой способ сделать это - это установить его в вашем ~ / .bash_profile (предполагая, что вы используете bash), как это:
export PYTHON_EGG_CACHE=/some/other/dir
Вам может потребоваться установить его в вашей среде Apache, если вы используете веб-приложение.
Это темный побочный эффект использования иначе приятных яиц механизма.
Яйца являются пакетами (каталог, полный файлов), упакованный в один .egg
Файл для упрощения деполимента.
Они хранятся в /site-packages/
реша.
До тех пор, пока файлы, хранящиеся в яйце .py
Файлы это отлично работает. Python Import может импортировать вещи из любого файлового объекта, как будто это был обычный файл.
Но когда что-то вроде .so
Бывает, чтобы падать там, Python не может объяснить базовую ОС, что она хочет загрузить библиотеку, которая не имеет физического имени. И единственными обходными пусками, которые авторы раздумятся о расстегнув его в темп. Естественно это не /site-packages/
поскольку /site-packages/
не пишется для обычных пользователей.
Так что вы можете либо
задавать
PYTHON_EGG_DIR
к/tmp
, илидать пользователю
www
Написать разрешение на/var/www/.python-eggs
(так что файлы не становятся расстегнуты каждый раз / TMP, очищены) или лучше тогдаРасстегните яйцо, как предложено @ Shalley303
(и избегайте расстегления яйца во время выполнения).
Яйца Python являются zip-сжатыми пакетами, содержащие как модули Python, и метаданные. Кэш яйца - это то, где экстрагированное содержимое яйца хранится таким образом, чтобы модули Python содержатся внутри пригодными для использования.
Вы также можете отключить использование .egg после его установки. Вам нужно пойти в каталог сайта-пакетов, извлеките .egg, а затем переместите его в скрытый файл (или удалить его или что-то еще).
Вот пример того, что я сделал, чтобы отключить модуль MySQLDB .egg файл, который вызывал эту ошибку, когда сценарий Python был запускается из 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
Филипп Б-Олхэм верно. Вы можете добавить эти строки в свой код:
import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp' # a writable directory
Простое исправление было бы созданию каталога и предоставить www-data
доступ к нему.
$ mkdir /var/www/.python-eggs
$ chown www-data:www-data /var/www/.python-eggs