ما هو ذاكرة التخزين المؤقت للبيضة Python (Python_egg_cache)؟

StackOverflow https://stackoverflow.com/questions/2192323

  •  25-09-2019
  •  | 
  •  

سؤال

لقد قمت للتو بالترقية من Python 2.6.1 إلى 2.6.4 على جهاز التطوير الخاص بي ، وعند بدء البرنامج النصي Python تم تقديم الرسالة التالية:

لا يمكن استخراج الملفات (الملفات) إلى ذاكرة التخزين المؤقت للبيض

حدث الخطأ التالي أثناء محاولة استخراج الملفات (الملفات) إلى ذاكرة التخزين المؤقت للبيضة:

Errno 13] تم رفض الإذن: '/var/www/.python-eggs'

تم تعيين دليل ذاكرة التخزين المؤقت للبيضة Python حاليًا على:

/var/www/.python-eggs

ربما لا يحصل حسابك على الوصول إلى هذا الدليل؟ يمكنك تغيير دليل ذاكرة التخزين المؤقت عن طريق تعيين متغير بيئة Python_egg_cache للإشارة إلى دليل يمكن الوصول إليه.

لا يوجد أي شيء في مستندات بيثون لذلك أنا في حالة من الخسارة فيما يتعلق بأفضل الممارسات حول مكان وضع هذا الدليل وما يستخدمه.

هل يمكن لأحد أن يشرح ماهية ذاكرة التخزين المؤقت للبيضة بيثون؟

أيضًا ، هل يمكنك شرح السبب/كيف يختلف عن site-packages يستخدم 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 (على افتراض أنك تستخدم باش) ، مثل هذا:

export PYTHON_EGG_CACHE=/some/other/dir

قد تحتاج إلى تعيينه في بيئة Apache إذا كنت تستخدم تطبيق الويب.

هذا هو الآثار الجانبية المظلمة لاستخدام آلية البيض اللطيفة.

البيض عبارة عن حزم (دليل مليء بالملفات) معبأة في واحدة .egg ملف لتبسيط devolyment.

يتم تخزينها في /site-packages/ دير.

طالما أن الملفات المخزنة في البيض .py ملفات أنها تعمل بشكل رائع. يمكن للاستيراد Python استيراد الأشياء من أي كائن يشبه الملف تمامًا كما كان ملفًا عاديًا.

لكن عندما يكون هناك شيء مثل .so يحدث أن يسقط هناك ، لا يمكن أن يشرح Python لنظام التشغيل الأساسي الذي يريد تحميل مكتبة لا تحتوي على اسم فعلي. والحل الوحيد المتكرر الذي فكر فيه مؤلفو Distutils هو إلغاء ضغطه في درجات الحرارة. بطبيعة الحال ليس كذلك /site-packages/ حيث /site-packages/ غير قابل للكتابة للمستخدمين العاديين.

لذلك يمكنك إما

  • جلس PYTHON_EGG_DIR ل /tmp, أو

  • إعطاء المستخدم www اكتب الإذن إلى /var/www/.python-eggs
    (بحيث لا يتم تنظيف الملفات في كل مرة /يتم تنظيف TMP) أو أفضل بعد ذلك

  • قم بفك ضغط البيضة كما اقترحها @shalley303
    (وتجنب إلغاء زيادة البيضة في وقت التشغيل تمامًا).

بيث بيثون عبارة عن حزم مضغوطة مضغوطة تحتوي على كل من وحدات بيثون والبيانات الوصفية. ذاكرة التخزين المؤقت للبيض هي المكان الذي يتم فيه تخزين محتويات البيض المستخرجة بحيث تكون وحدات الثعبان الموجودة داخلها قابلة للاستخدام.

يمكنك أيضًا تعطيل استخدام. egg بعد تثبيته. تحتاج إلى الذهاب إلى دليل حزم الموقع ، واستخراج. egg ، ثم نقله إلى ملف مخفي (أو حذفه ، أو أي شيء آخر).

فيما يلي مثال على ما فعلته لتعطيل ملف MySQLDB.

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top