أوبونتو + virtualenv = فوضى؟Virtualenv يكره حزم التوزيع، ويريد حزم الموقع

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

سؤال

هل يمكن لأحد أن يشرح لي ما الذي يحدث مع بيثون في أوبونتو 9.04؟

أحاول أن تدور virtualenv, ، و ال --no-site-packages يبدو أن العلم لا يفعل شيئًا مع أوبونتو.أنا ركبت virtualenv 1.3.3 مع easy_install (الذي قمت بالترقية إليه setuptools 0.6c9) ويبدو أن كل شيء قد تم تثبيته /usr/local/lib/python2.6/dist-packages

أنا يفترض أنه عند تثبيت حزمة باستخدام apt-get، يتم وضعها فيها /usr/lib/python2.6/dist-packages/ ?

المشكلة هي أن هناك /usr/local/lib/python2.6/site-packages فضلا عن أن مجرد الجلوس هناك فارغة.يبدو (من خلال النظر إلى path في virtualenv) أن هذا هو المجلد الذي يستخدمه virtualenv كنسخة احتياطية.وهكذا حتى اعتقدت أنني أغفل --no-site-packages, ، لا أستطيع الوصول إلى حزم أنظمتي المحلية من أي من أنظمة Virtualenv الخاصة بي.

لذلك أسئلتي هي:

  1. كيف يمكنني الحصول على virtualenv للإشارة إلى أحد dist-packages?
  2. أيّ حزم dist هل يجب أن أشير إليها؟ /usr/lib/python2.6/dist-packages أو /usr/local/lib/python2.6/dist-packages/
  3. ما هو الهدف من /usr/lib/python2.6/site-packages؟لا يوجد شيء هناك!
  4. هل من يأتي أولاً يخدم أولاً على الطريق؟إذا كان لدي إصدار أحدث من الحزمة XYZ مثبتة فيه /usr/local/lib/python2.6/dist-packages/ والأقدم (من ubuntu repos/apt-get) في /usr/lib/python2.6/dist-packages, ، أيهما يتم استيراده عندما أقوم بذلك import xyz؟أفترض أن هذا يعتمد على قائمة المسار، أليس كذلك؟
  5. لماذا بحق الجحيم هذا مربك جدا؟هل هناك شيء أفتقده هنا؟
  6. أين يتم تعريف ذلك easy_install يجب تثبيت ل /usr/local/lib/python2.6/dist-packages?
  7. هل سيؤثر هذا pip أيضًا؟

شكرا لأي شخص يمكنه مسح هذا!

هل كانت مفيدة؟

المحلول

سأميل إلى اختراقها عن طريق جعل حزم الموقع رابطًا لحزم التوزيعة، ولكن أعتقد أن هذا قد يؤثر على الحالات الأخرى التي تريد فيها تثبيت بعض الامتدادات بخلاف تلك الموجودة في توزيعة أوبونتو.لا أستطيع التفكير في إجابة أخرى لـ 1 باستثناء التغيير والتبديل في مصادر virtualenv (مع كون كل من ubuntu و virtualenv شائعين جدًا ولن أتفاجأ عندما أجد إصدارات معدلة موجودة بالفعل).

فيما يتعلق بالأمر 2، إذا كنت تستخدم /usr/local/bin/python، فيجب عليك استخدام الإصدار /usr/local من lib (بما في ذلك حزم الموقع) والعكس إذا كنت تستخدم /usr/bin/python.

فيما يتعلق بالإصدار 3، سيكون هناك شيء ما إذا قمت بتثبيت ملحق لـ /usr/bin/python من المصادر (وليس عبر easy_install أو من توزيعة ubuntu).

إعادة 4، نعم، الإدخالات السابقة على المسار لها الأسبقية.

إعادة 5، easy_install سهل من حيث اسمه فقط - فهو يفعل الكثير من السحر المظلم لدرجة أنه تم إبقاؤه بعناية خارج مكتبة python القياسية على الرغم من ملاءمته لأن الإجماع بيننا نحن ملتزمي python هو أن السحر المظلم العميق للراحة هو "سهل" فقط على السطح.

فيما يتعلق بالإصدار 6، أعتقد أن هذا يعد تعديلًا على ubuntu لـ easy_install - إذا كان هذا صحيحًا، فسيتم تعريفه أينما يتخذ Canonical أو مشرفو ubuntu الآخرون قراراتهم الجماعية.

إعادة 7، آسف، ليس لدي أي فكرة - ليس لدي نظام Ubuntu حديث بشكل معقول في متناول اليد للتحقق منه.

نصائح أخرى

أعتقد أن إجابة مايك أور من القائمة البريدية لـ virtual-env يبدو أنه الأفضل.لاحظ أن OP نشر هذا السؤال في كلا المكانين.

المحتوى الأصلي للبريد:

منذ سنوات ، تم إنشاء Debian/usr/local/lib/pythonversion/site site ، وتجميع ثنائي python لتضمينه في مسار البحث الافتراضي.اتبعت Ubuntu خطى دبيان كما تفعل عادةً.لم يعجب مطورو Python هذا لأنك ستحصل على تداخل مع دليل/usr/usr/bin/bin/python باستخدام دليل حزم الموقع نفسه.قرر Ubuntu أخيرًا التخلي عن حزم الموقع واستخدام حزم Dist بدلاً من ذلك ، وهو الاسم الذي اخترعوه حتى لا يتداخل مع أي شيء.قصة Loing موجودة في مكان ما إذا قمت بوجود Google ، في مكان ما في Python Bug Tracker أو Distutils SIG أو ذلك.

يعمل النظام، على الأقل إذا كنت تستخدم حزمة Ubuntu virtualenv.واجه بعض الأشخاص مشاكل في استخدام Virtualenv المثبت محليًا على Ubuntu لأن إدخالات Magic Sys.path لم يتم إضافتها أو شيء من هذا القبيل.لست متأكدًا-حزم المواقع لأنني لا أستخدم هذا الخيار أبدًا:أقوم بتشغيل PIL و MySQLDB من حزم Ubuntu لأنه قد يكون من الصعب تجميع تبعيات C في بعض الأحيان.(بحاجة إلى ملفات الرأس اليمنى ، يتجاهل Python ملفات الرأس ، إلخ)

لذلك انتقلت حزم ubuntu python إلى/usr/lib/pythonversion/dist.أو هذا الدليل الداعم للثعبان لسبب ما.حزم Python المثبت محليًا تنتقل إلى/usr/local/lib/pythonversion/dist-packages بشكل افتراضي.عندما أقوم بتثبيت نظام Ubuntu 9.04 أقوم بتشغيله:

$ sudo apt-get تثبيت python-setuptools (6.0c9) $ sudo app-get تثبيت python-virtualenv (1.3.3) $ sudo easy_install pip $ sudo pip تثبيت Virtualenvwrapper

تعمل Virtualenvs بشكل جيد بهذه الطريقة، على الرغم من أنني لم أحاول --no-site-packages.

أحاول أن أقوم بدوران VirtualEnv ، ويبدو أن علامة الحزم-لا مواقع لا تفعل شيئًا مع Ubuntu.لقد قمت بتثبيت Virtualenv 1.3.3 مع Easy_install (التي قمت بترقيتها إلى Setuptools 0.6C9)

هذه الإصدارات كلاهما في Ubuntu 9.04 ، لذلك أنت تجعل الأمر أكثر صعوبة على تثبيتها محليًا.

ويبدو أن كل شيء مثبت على /usr/local/lib/python2.6/dist-packages

نعم

أفترض أنه عند تثبيت حزمة باستخدام apt-get ، يتم وضعها في/usr/lib/python2.6/dist-packages/؟

نعم

  1. هل من يأتي أولاً يخدم أولاً على الطريق؟إذا كان لدي إصدار أحدث من الحزمة XYZ مثبتة في /usr/local/lib/python2.6/dist- حزم/وأقدم واحد (من ubuntu repos/apt- get) في/usr/lib/python2.6/dist -القوانين ، أي واحد يتم استيراده عند استيراد XYZ؟أفترض أن هذا يعتمد على قائمة المسار، أليس كذلك؟

يتم فحص sys.path بالترتيب.الشيء المضحك الوحيد هو أن بيض.ولكن إذا كنت تستخدم PIP لكل ما يمكن أن تفعله (أيباستثناء تثبيت PIP نفسه ، والبيض المسبق ، وقطعة من الدليل المحلي الذي يعد نسخة بدلاً من رابط البيض) ، لن يكون لديك العديد من البيض.

  1. لماذا بحق الجحيم هذا مربك جدا؟هل هناك شيء أفتقده هنا؟

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

  1. هل سيؤثر هذا على النقطة أيضًا؟

نعم ، سيتم تثبيت PIP تلقائيًا على/usr/local/lib/pythonversion/site.استخدم "Pip install -e $ dirtual_env packagename" للتثبيت في VirtualEnv.

يجب ألا تلمس تثبيت Python الخاص بـ Ubuntu إلا إذا كنت تقوم ببناء أدوات إدارة النظام، أو إنشاء شيء يمكن اعتباره خدمة نظام جديدة.

إذا كنت تستخدم Ubuntu لتطوير أو نشر تطبيقات Python، فقم دائمًا ببناء Python الخاص بك من المصدر، ثم قم بتوزيعه، واستخدمه للنشر.بهذه الطريقة، سيكون لديك كافة الأدلة في المكان الصحيح وسيعمل virtualenv بشكل طبيعي.إذا كنت ستنشر العديد من تطبيقات Python على الخادم، فاجعل Python الخاص بك موجودًا في مكان ما مثل /home/python أو /opt/python أو في مكان ما خارج الدليل الرئيسي الخاص بك.تأكد من أن لديك أذونات الكتابة لمجموعة المطورين (users؟) حتى يتمكن الأشخاص من إضافة الحزم بسهولة.

يتيح لك هذا أيضًا الحصول على مستويين من الحزم.يمكن تثبيت الأدوات القياسية الداخلية لديك في توزيعة Python الخاصة بك وتكون جزءًا من tarball التي تنشرها، وستكون الحزم الخاصة بالتطبيق فقط موجودة في بيئة افتراضية.

لا تقم بترقية أو تعديل نظام Ubuntu المثبت على Python.

حسنًا، لدي Ubuntu 9.04 وحاولت بسرعة إعداد صندوقين من صناديق الحماية مع حزم الموقع وواحد بدونها.والأمور تسير على ما يرام.

الاختلاف الوحيد في النهج الذي اتبعته هو أنني استخدمت حزمة Ubuntu's python-virtualenv (1.3.3).وافترض أنه تم تعديله بواسطة فريق Ubuntu ليناسب إعدادات Ubuntu.

لتلخيص ذلك، قم بتعطيل virtualenv easy_installed لفترة من الوقت، استخدم python-virtualenv المعبأ ومعرفة ما إذا كان ذلك يلبي توقعاتك.

في الواقع، نحن نستخدم إعدادًا مشابهًا للإنتاج دون أي مشكلة.تم الرد على الباقي بالفعل بواسطة Alex.

طريقة أخرى لإصلاحها:
https://stackoverflow.com/a/17265840/202168

يجب أن تتذكر القيام بذلك في كل Virtualenv حيث تحتاج إليه، ولكن لا يعتمد على الاختراقات أو إصدار خاص من virtualenv

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top