طلب حزمة واحدة يثبّت عدة حزم أحيانا. قِيس بتاريخ 2026-09-24: تثبيت arabic-reshaper في بيئة جديدة أبلغ Successfully installed arabic-reshaper-3.0.0 python-bidi-0.6.6: حزمتان لاسم واحد. الثانية قرار شخص آخر، ستُحدَّث بجدول شخص آخر، وصارت من الآن مسؤوليتك أن تبقى تعمل.
حطّتا داخل المجلد ولا مكان آخر. من مفسر البيئة نفسه ينجح الاستيراد؛ من مفسر النظام في الصدفة نفسها، import arabic_reshaper يجيب ModuleNotFoundError: No module named 'arabic_reshaper'. هذه هي الآلية كلها، وهي سبب أن الأمر نفسه يعمل لزميلك ولا يعمل لكِ.
ما تكونه البيئة الافتراضية بالضبط
هي مجلد بمفسره الخاص وsite-packages الخاصة به، وقيمة واحدة تفضحها: بداخلها sys.prefix يختلف عن sys.base_prefix. هذا السطر الوحيد هو الطريقة الموثوقة لمعرفة أي بيئة أنتِ فيها، ويستحق أكثر من قراءة الموجّه، لأن الموجّه قد يكذب وتلك المقارنة لا تكذب.
بيئة جديدة تحوي pip ولا شيء غيره. كل ما ثبّتته الآلة عالميا غائب عنها، عمدا، وهذه هي الخاصية المشتراة: مشروعان يريدان نسختين مختلفتين من المكتبة نفسها يتوقفان عن كونهما مشكلة أصلا.
التفعيل راحة، والمسار هو الحقيقة
التفعيل يعدّل PATH كي تعني كتابة python مفسر البيئة. لا شيء آخر يحدث، ولهذا كل عطل في هذا الباب له الحل نفسه: التوقف عن الاعتماد على التفعيل واستدعاء المفسر بمساره. ./demoenv/bin/python -m pip install arabic-reshaper يعمل سواء فُعّلت البيئة أم لا، داخل مهمة مجدولة، داخل ملف Makefile، وداخل محرر فتح صدفته الخاصة.
عادتان تتبعان ذلك. شغّلي pip بصيغة python -m pip لا pip وحدها، كي لا يختلف pip الذي تشغلينه عن المفسر الذي تثبّتين فيه. ولا تثبّتي أبدا في مفسر النظام: على جهاز حديث سيرفض غالبا من تلقاء نفسه، وحيث لا يرفض فهو يضع تبعيات مشروعك حيث يراها كل مشروع آخر.
ما يجعل التشغيل قابلا للتكرار
python -m pip freeze تطبع بالضبط ما هو مثبت بنسخه الدقيقة، سطران للتثبيت أعلاه، يبدآن arabic-reshaper==3.0.0. الالتزام بذلك هو الحد الأدنى: بدونه يحصل الشخص التالي على ما كان حاضرا يوم شغّل التثبيت، ويبدأ بلاغ العلة بمجموعتي نسخ مختلفتين.
الشكل الحالي أفضل من قائمة مجمّدة، لأن القائمة المجمّدة لا تميّز تبعياتك المباشرة عن التي جاءت معها. الإعلان عن arabic-reshaper في pyproject.toml وترك أداة تكتب ملف القفل يحافظ على ذلك الفرق، فترقية شيء واحد لا تحتاج معرفة أي الاسمين طلبتِه فعلا.
ما تستخدمينه في 2026
uv هي الأداة التي انتقلت إليها أغلب مشاريع بايثون بحلول 2026، مجانية ومفتوحة المصدر. تنشئ البيئة وتحل التبعيات وتثبّتها وتكتب ملف قفل، في برنامج واحد بدل ثلاثة، وسريعة بما يكفي كي تتوقف البيئة عن كونها شيئا يتجنب أحد إعادة إنشائه. حلّت محل تركيبة venv وpip وpip-tools، والملاحظة الصادقة أن python -m venv وpython -m pip حاضران دائما، وهذا سبب كتابة هذه الصفحة عليهما.
pyproject.toml هو الملف، مجاني مع النظام البيئي والمعيار اعتبارا من 2026. حلّ محل setup.py وعادة requirements.txt غير المنضبطة، والمكسب العملي أن التبعيات المُعلَنة والمُحلولة قائمتان مختلفتان في ملفين مختلفين، وهو الفرق الذي تحتاجه الفقرة أعلاه.
أين يبدأ الالتباس فعلا
هذا عطل القسم كله، ويظهر مبكرا: من تكتب بايثون تلتقي ببيئة ترفض التثبيت، فتظن نفسها سيئة في البرمجة، بينما هي تلتقي فعلا بالتحزيم، وهو ما لم يخبرها أحد أنه موضوع منفصل. هو كذلك، وله مفرداته الخاصة، ويستغرق أسبوعين لا بعد ظهر واحد.
العادة التي تزيل معظمه: قبل أن يفشل أي شيء آخر، شغّلي python -c "import sys; print(sys.executable)" واقرئي أي مفسر تخاطبينه فعلا. تقريبا كل تثبيت لم يعمل سببه ذلك المسار مختلفا عن المسار الذي يشغّل الكود. الأساليب التي كانت ستُكتب يدويا لو غاب هذا كله موضوعها أساسيات بايثون، وما يجعل نصا عربيا يظهر بالاتجاه الصحيح داخل ملف بايثون نفسه موضوعه كيف يعمل الكود، وتغليف البيئة كلها بدل إعادة بنائها في كل مرة هو ما تفعله الحاويات.