Що таке кеш-пам’ять Python (PYTHON_EGG_CACHE)?


74

Я щойно оновив 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 використовує для зберігання яєць (як я розумію)?

Відповіді:


67

З моїх досліджень виявляється, що деякі яйця упаковуються у zip-файли і зберігаються як такі в site-packagesкаталозі Python .

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

Існує ряд виправлень:

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

7
Python може отримати доступ до файлів у .zip-файлах. Їх потрібно витягти лише тоді, коли програма хоче ім’я файлу замість файлоподібного об’єкта для ресурсу (або каталогу) всередині яйця. Зазвичай це відбувається з веб-серверами тощо.
wump

2
Варто також згадати, що .python-egg бере вашу маску без додавання дозволів на виконання в каталог. Каталоги недоступні без дозволів на виконання, тому ви отримуєте ту ж помилку, що і вище.
joedborg

1
Цікаво, чому для нього буде встановлено значення /var/www/.python-eggsза замовчуванням, а не десь більш стандартного вигляду ....
tutuca

2
+1 для варіанту 3. Сьогодні це вислуховувало мене годинами. Використання easy_install з опцією -Z вирішило мою проблему за лічені секунди. Easy_install, це не так просто.
Денніс Баузус,

30

Яєчний кеш python - це просто каталог, який використовуються setuptools для зберігання встановлених пакунків, які відповідають специфікації яйця . Детальніше про setuptools ви можете прочитати тут .

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

export PYTHON_EGG_CACHE=/some/other/dir

Можливо, вам доведеться встановити його у своєму середовищі Apache, якщо ви використовуєте веб-програму.


Я вирішив невизначену змінну середовища в веб - сервері Google App Engine редагуванням app.yaml так: env_variables: PYTHON_EGG_CACHE: 'C: \ python27 \ Lib \ сайт-пакети' stackoverflow.com/questions/31122337 / ...
dbasch

12

Це темний побічний ефект від використання інакше приємного механізму яєць.

Яйця - це пакети (каталог, заповнений файлами), упаковані в один .eggфайл для спрощення деполіментації.

Вони зберігаються в /site-packages/рег.

Поки файли, що зберігаються в яйці, є .pyфайлами, це чудово працює. Імпорт Python може імпортувати речі з будь-якого файлоподібного об'єкта так само, як це був звичайний файл.

Але коли щось подібне .soтрапляється туди, python не може пояснити базовій ОС, що хоче завантажити бібліотеку, яка не має фізичного імені. І єдине обхідне рішення, про яке автори задумали, - це розпакувати його в тимчасовий каталог. Звичайно, це не /site-packages/так, оскільки /site-packages/не є доступним для звичайних користувачів.

Тож ти можеш або

  • встановити PYTHON_EGG_DIRв /tmp, або

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

  • розпакуйте яйце, як запропонував @ shalley303
    (і взагалі уникайте розпакування яйця під час роботи).


3

Ви також можете відключити використання .egg після його встановлення. Вам потрібно зайти в каталог сайтів-пакетів, витягти .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

Я не думаю, що ви отримуєте .eggз PyODBC, просто .egg-infoа.so
Джодборг

Це працює для мене, якщо замість переходу MySQL_python-1.2.3-py2.7-linux-x86_64.eggдо .MySQL_python-1.2.3-py2.7-linux-x86_64.eggя переміщу розпакований EGG-INFOфайл доMySQL_python-1.2.3-py2.7-linux-x86_64.egg-info
Mike Dacre

3

Яйця Python - це стиснені на zip-пакети, що містять як модулі Python, так і метадані. В кеш-пам’яті яєць зберігається вилучений вміст яйця, щоб модулі Python, що містяться в ньому, були придатними для використання.


1

Філіп Б Олдем праворуч. Ви можете додати в свій код такі рядки:

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

0

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

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

0

Я отримав цю помилку в 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.)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.