إدارة مسار Python عند نقل التعليمات البرمجية من تطوير الكمبيوتر إلى الهدف
-
21-09-2019 - |
سؤال
لدي مشروع Python مع بنية الدليل هذه وهذه الملفات:
/home/project_root
|---__init__.py
|---setup
|---__init__.py
|---configs.py
|---test_code
|---__init__.py
|---tester.py
يستورد برنامج Tester Script من الإعداد/configs.py مع مرجع "SETUP.CONFIGS". إنه يعمل بشكل جيد على آلة التطوير الخاصة بي.
هذا يعمل على كمبيوتر التطوير (Linux). عندما أنقل هذا إلى كمبيوتر آخر (Linux) ، قمت بتعيين Pythonpath
PYTHONPATH = "/home/project_root"
ولكن عندما أقوم بتشغيل tester.py ، لا يمكن العثور على وحدة التكوينات. وعندما أقوم بتشغيل مترجم Python التفاعلي ، لا يتضمن Sys.Path دليل /home /project_root. لكن /الصفحة الرئيسية /project_root يظهر عندما أقوم بتردد $ pythpath.
ماذا أفعل خطأ هنا؟
(لا أريد الاعتماد على ملف .bashrc لتعيين Pythonpath للجهاز الهدف-الرمز مخصص لتطبيق Django ، وسيتم تشغيله في النهاية بواسطة www-data. وأعلم أن تكوين Apache لـ يتضمن Django مواصفات لـ Pythonpath ، لكنني لا أريد استخدام ذلك هنا لأنني أحاول أولاً التأكد من اجتياز الكود اختبارات وحدته في بيئة الماكينة المستهدفة.)
فضولي و فضولييبدو أن هذه مشكلة مستخدم وأذونات. - عند إطلاقه بواسطة أمر من مستخدم عادي ، يمكن للمترجم الفوري استيراد الوحدات النمطية كما هو متوقع. - عند إطلاق Sudo (أقوم بتشغيل Ubuntu هنا) ، لا يمكن للمترجم الفوري استيراد الوحدات النمطية كما هو متوقع. - لقد تم الاتصال بالبرنامج النصي للاختبار مع Sudo ، حيث أن الملفات مملوكة لـ www-data (سيتم استدعاؤها من قبل المستخدم الذي يقوم بتشغيل Apache كجزء من تطبيق Django). - بعد تغيير ملكية الملفات إلى مستخدم عادي ، البرنامج النصي اختبار يفعل قم بتشغيل أخطاء الاستيراد (وإن كان ذلك ، في جميع أنواع الجدران ذات الصلة بالمستخدم).
اسف لتضييع وقتك. يجب أن يكون هذا السؤال مغلقًا.
المحلول
عصا هذا في البرنامج النصي اختبار مباشرة قبل import setup.configs
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path
هي قائمة بجميع الدلائل التي يبحث عنها مترجم Python عند استيراد وحدة Python. سيؤدي ذلك إلى إضافة الدليل الأصل الذي يحتوي على وحدة إعداد إلى بداية تلك القائمة مما يعني أنه سيتم فحص الدليل المحلي أولاً. هذا أمر مهم إذا كان لديك وحدة تثبيت الوحدة النمطية على نطاق واسع. مزيد من المعلومات حول ذلك هنا: SYS DOC.
تعديل: يمكنك أيضا وضع ملف .pth في /usr/local/lib/python2.X/site-packages/
ملف .pth هو ببساطة ملف نصي به مسار دليل على كل سطر سيبحثه مترجم Python. لذا فقط أضف ملفًا بهذا السطر فيه:
/home/project_root
نصائح أخرى
حاول بشكل صريح تعيين مسار بيثون الخاص بك في البرامج النصية الخاصة بك. إذا كنت لا تريد تغييره ، فيمكنك دائمًا إضافة شيء مثل "../" إلى المسار في اختبار. ذلك بالقول:
sys.path.append("../")
(لا أريد الاعتماد على ملف .bashrc لتعيين Pythonpath للجهاز الهدف-الرمز مخصص لتطبيق Django ، وسيتم تشغيله في النهاية بواسطة www-data. وأعلم أن تكوين Apache لـ يتضمن Django مواصفات لـ Pythonpath ، لكنني لا أريد استخدام ذلك هنا لأنني أحاول أولاً التأكد من اجتياز الكود اختبارات وحدته في بيئة الماكينة المستهدفة.)
إذا كان الكود لتطبيق Django ، فهل هناك سبب عدم اختباره في سياق مشروع Django؟ إن اختباره في سياق مشروع Django يعطي فوائد زوجين:
- Django
manage.py
سيتم إعداد بيئة بيثون لك. سوف تضيف مسارات المشروع المناسبة إلىsys.path
, ، وسوف يضبط متغير البيئةDJANGO_SETTINGS_MODULE
بشكل صحيح. - تتضمن مكتبات Django مرافق اختبار الوحدة الواسعة ، ويمكنك بسهولة تمديد هذه الوظيفة لتشمل مرافق الاختبار الخاصة بك. يعد تنفيذ الاختبارات في مشروع Django سهلاً مثل تنفيذ أمر واحد عبر
manage.py
.