سؤال

حسنًا ، أريد استخدام Web2Py لأنه جميل جدًا .. أنا فقط بحاجة إلى تغيير دليل العمل إلى الدليل حيث تكون جميع الوحدات/المكتبات/التطبيقات الخاصة بي حتى أتمكن من استخدامها. أريد أن أكون قادرًا على استيراد برنامجي الحقيقي عندما أستخدم واجهة/تطبيقات Web2Py. أحتاج إلى القيام بذلك بدلاً من وضع جميع تطبيقاتي والأشياء داخل مجلد Web2Py ... أحاول إعطاء برنامجي واجهة ويب دون وضع البرنامج في مجلد Web2Py .. آسف إذا كان من الصعب فهم ذلك.

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

المحلول

OS.Chdir يتيح لك تغيير دليل عمل نظام التشغيل ، ولكن لأغراضك (تمكين واردات مجموعة من الوحدات & c التي تقييد للعيش في مكان غريب) يبدو من الأفضل إضافة الدلائل المطلوبة إلى Sys.path في حين أن.

نصائح أخرى

في أي برنامج Python متعدد الخيوط (وليس فقط Python) ، يجب ألا تستخدم OS.Chdir ويجب ألا تقوم بتغيير Sys.Path عندما يكون لديك أكثر من موضوع واحد. انها ليست آمنة لأنها تؤثر على المواضيع الأخرى. علاوة على ذلك ، يجب ألا تنفجر sys.path.append () في حلقة لأنه قد ينفجر.

جميع أطر الويب متعددة الخيوط ويتم تنفيذ الطلبات في حلقة. لا تسمح لك بعض أطر عمل الويب بتثبيت/إلغاء التثبيت دون إعادة تشغيل خادم الويب ، وبالتالي إذا تم تنفيذ OS.Chdir/Sys.Path.Append فقط عند بدء التشغيل ، فلا توجد مشكلة.

في Web2Py ، نريد أن نكون قادرين على تثبيت/إلغاء تثبيت التطبيقات دون إعادة تشغيل خادم الويب. نريد أن تكون التطبيقات ديناميكية للغاية (على سبيل المثال تحديد النماذج بناءً على المعلومات المقدمة مع طلب HTTP). نريد أن يحتوي كل تطبيق على مجلد للموديلات الخاصة به ونريد فصلًا كاملاً بين التطبيقات ، بحيث إذا احتاج تطبيقان إلى إصدارات مختلفة من نفس الوحدة ، فإنها لا تتعارض مع بعضها البعض ، لذلك نوفر واجهات برمجة التطبيقات للقيام بذلك (طلب. ، local_import).

لا يزال بإمكانك استخدام OS.Chdir و Sys.Path.Append ولكن يجب عليك القيام بذلك خارج مؤشرات الترابط (وهذه ليست مشكلة محددة Web2Py). يمكنك استخدام الاستيراد في أي مكان تريده كما تفعل في أي برنامج Python آخر.

أقترح بشدة نقل هذه المناقشة إلى قائمة البريد Web2Py.

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

# use this in your controller code
impname = local_import('module_in_modules', reload=True)
# reload true  will ensure that it will re load whenever
# there are changes to the module

جاي

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