إدارة مسار Python عند نقل التعليمات البرمجية من تطوير الكمبيوتر إلى الهدف

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

  •  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 يعطي فوائد زوجين:

  1. Django manage.py سيتم إعداد بيئة بيثون لك. سوف تضيف مسارات المشروع المناسبة إلى sys.path, ، وسوف يضبط متغير البيئة DJANGO_SETTINGS_MODULE بشكل صحيح.
  2. تتضمن مكتبات Django مرافق اختبار الوحدة الواسعة ، ويمكنك بسهولة تمديد هذه الوظيفة لتشمل مرافق الاختبار الخاصة بك. يعد تنفيذ الاختبارات في مشروع Django سهلاً مثل تنفيذ أمر واحد عبر manage.py.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top