PythonPath مقابل sys.path.
-
19-09-2019 - |
سؤال
يجب استخدام مطور آخر وأنا غير موافق حول ما إذا كان يجب استخدام PythonPath أو sys.path للسماح بثثون للعثور على حزمة بيثون في دليل المستخدم (على سبيل المثال، التطوير).
لدينا مشروع بيثون مع هيكل الدليل النموذجي:
Project
setup.py
package
__init__.py
lib.py
script.py
في النصي. نحن بحاجة إلى القيام به import package.lib
. وبعد عندما يتم تثبيت الحزمة في حزم الموقع، يمكن أن تجد Script.py package.lib
.
عند العمل من دليل المستخدم، ومع ذلك، يجب القيام بشيء آخر. الحل الخاص بي هو تعيين بلدي pythonpath لتشمل "~ / المشروع". يريد مطور آخر وضع هذا الخط من التعليمات البرمجية في بداية Script.py:
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
بحيث يمكن لبثون العثور على نسخة محلية من package.lib
.
أعتقد أن هذه فكرة سيئة، لأن هذا الخط مفيد فقط للمطورين أو الأشخاص الذين يعملون من نسخة محلية، لكن لا يمكنني إعطاء سبب وجيه لأنها فكرة سيئة.
يجب أن نستخدم PytohnPath، sys.path، أو إما بخير؟
المحلول
إذا كان السبب الوحيد لتعديل المسار مخصص للمطورين الذين يعملون من شجرة العمل الخاصة بهم، فيجب عليك استخدام أداة تثبيت لإعداد بيئتك لك. Virtualenv شائعة جدا، وإذا كنت تستخدم Setuptools، يمكنك ببساطة تشغيل setup.py develop
إلى شبه تثبيت شجرة العمل في تثبيت Python الحالي الخاص بك.
نصائح أخرى
أنا أكره pythonpath. أجد أنها هشة ومزعجة لتعيين أساس لكل مستخدم (خاصة لمستخدمي الخفيين) وتتبع مجلدات المشروع تتحرك حولها. أنا أفضل مجموعة sys.path
في البرامج النصية لاستدعاء المشاريع المستقلة.
لكن sys.path.append
ليست هي الطريقة للقيام بذلك. يمكنك بسهولة الحصول على التكرارات، ولا يقوم بذلك .pth
الملفات. أفضل (وأكثر قابلية للقراءة): site.addsitedir
.
و script.py
لن يكون عادة مكان أكثر ملاءمة للقيام بذلك، كما هو داخل الحزمة التي تريد إتاحةها على المسار. يجب أن تكون وحدات المكتبة بالتأكيد لا تمس sys.path
أنفسهم. بدلا من ذلك، عادة ما يكون لديك برنامج نصي هش خارج الحزمة التي تستخدمها لإرساء التطبيق وتشغيله، وهو في هذا البرنامج النصي التجمع Trivial الذي تضع تفاصيل النشر sys.path
- probbing.
بشكل عام، أود أن أفكر في إنشاء متغير بيئة (مثل PythonPath) بممارسة سيئة. في حين أن هذا قد يكون على ما يرام لتصحيح الأخطاء ولكن باستخدام هذا كما
ممارسة منتظمة قد لا تكون فكرة جيدة.
استخدام البيئة المتغير يؤدي إلى مواقف مثل "يعمل بالنسبة لي" عندما
آخر تقارير المشاكل في قاعدة التعليمات البرمجية. أيضا قد يحمل المرء نفس الممارسة مع بيئة الاختبار أيضا، مما يؤدي إلى مواقف مثل الاختبارات التي تعمل بشكل جيد لمطور معين ولكن ربما فشلت عند إجراء بعض الاختبارات.
جنبا إلى جنب مع العديد من الأسباب الأخرى المذكورة بالفعل، يمكنك أيضا توجيه Outh هذا الترميز الصعب
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
هش لأنه يفترض موقع النصوص. فان سيعمل فقط إذا كان Script.py موجود في المشروع / الحزمة. سوف ينكسر إذا قرر المستخدم نقل / نسخ / symlink script.py (تقريبا) في أي مكان آخر.
أعتقد أنه في هذه الحالة باستخدام PythonPath هو أفضل شيء، ومعظمه لأنه لا يعرض (مشكوك فيه) رمز غير عملي.
بعد كل شيء، إذا كنت تفكر في ذلك، المستعمل لا تحتاج إلى ذلك sys.path
شيء، لأن الحزمة الخاصة بك سوف تتثبيت في حزم الموقع، لأنك ستستخدم نظام التعبئة والتغليف.
إذا اختار المستخدم تشغيل من "نسخ محلي"، فأما لاحظت ذلك، فإن الممارسة المعتادة هي الدولة، أن الحزمة تحتاج إلى إضافة إلى PythonPath يدويا، إذا تم استخدامها خارج حزم الموقع وبعد