2011-01-11 33 views
19

मेरे पास func.py में कुछ फ़ंक्शन हैं जो मैं अपने वेब 2py नियंत्रक से default.py नामक एक्सेस करना चाहता हूं। मैंने default.py में "आयात func" और "countatesomething = func.calculatesomething" के साथ func.py आयात करने और उपयोग करने का प्रयास किया, लेकिन यह काम नहीं करता है। फ़ाइल func.py को मेरे वेब 2py प्रोग्राम के मॉड्यूल अनुभाग में भी जोड़ा गया है।मैं web2py में मॉड्यूल का उपयोग कैसे कर सकता हूं?

यह क्यों काम नहीं कर रहा है? मैं इसे कैसे काम कर सकता हूं? क्या मॉड्यूल func.py या default/func.py या कुछ और होना चाहिए?

उत्तर

27

funcPYTHONPATH (sys.path) में web2py/site-packages जैसी जगह पर होना चाहिए। यह करने का यह उचित पायथनिक तरीका है।

आप पैकेज चाहते हैं आपकी ऐप्लिकेशन के साथ अपने मॉड्यूल, तो यह applications/yourapp/modules में जगह, अगले, आप इसके साथ आयात करना चाहिए func = local_import('func')

प्रश्न: जो लोग web2py के लिए नए हैं आश्चर्य हो सकता है: क्यों local_import() का उपयोग करें जब पाइथन दुनिया में पूर्व विधि मानक है?

ए: क्योंकि वेब 2py में आप सर्वर को पुनरारंभ किए बिना नए ऐप्स इंस्टॉल कर सकते हैं। ऐप्स sys.path नहीं बदल सकते हैं क्योंकि यह थ्रेड सुरक्षित नहीं है और उन ऐप्स को इंस्टॉल करने के क्रम पर निर्भर करेगा। इसके अलावा दो ऐप्स को एक ही नाम के साथ मॉड्यूल की आवश्यकता हो सकती है लेकिन अलग-अलग (उदाहरण के लिए विभिन्न संस्करण)। हम उन मॉड्यूल और अन्य मॉड्यूल के बीच संघर्ष से बचना चाहते हैं जो पूर्व-स्थापित हो सकते हैं।

local_import() एक वर्कअराउंड है जो आपको अपने ऐप्स के साथ कुछ मॉड्यूल भेजने और उन्हें sys.path पर फ़ोल्डर जोड़ने के बिना आयात करने और संस्करण विवादों के कारण आयात करने की अनुमति देता है।

34

उपयोगकर्ता570039 के उत्तर में थोड़ा सा जोड़ने के लिए, स्थानीय_import को here पर दस्तावेज़ित किया गया है। इसमें reload पैरामीटर शामिल है। प्रलेखन के अनुसार:

जब आप reload=True निर्दिष्ट करते हैं, तो यह प्रत्येक अनुरोध पर मॉड्यूल को फिर से आयात करेगा; अन्यथा आपकी अजगर प्रक्रिया केवल मॉड्यूल को आयात करेगी। डिफ़ॉल्ट reload=False है।

विकास में, reload=True की स्थापना सुविधाजनक हो सकता है क्योंकि आपके मॉड्यूल में परिवर्तन पुन: प्रारंभ करने की आवश्यकता के बिना तुरंत काम करेंगे। हालांकि, प्रत्येक अनुरोध पर पुन: आयात करने से प्रदर्शन धीमा हो जाएगा, इसलिए उत्पादन में reload=False की अनुशंसा की जाती है।


अद्यतन: हालात बदल गए हैं। local_import को से हटा दिया गया है। आप /applications/myapp/modules/mymodule.py है, तो आप ऐसा करके MyApp भीतर यह आयात कर सकते हैं:

import mymodule 

web2py sys.path के बाकी की जाँच से पहले आवेदन की "मॉड्यूल" फ़ोल्डर की जाँच करेगा।

अधिक जानकारी के लिए, here देखें।

+0

धन्यवाद, दोस्तों!इन दोनों उत्तरों बहुत उपयोगी थे! – user569474

+0

मैं फ़ोल्डरों के साथ ऐसा कैसे कर सकता हूं? उदाहरण के लिए, जब मैं 'fuzzywuzzy'] (https://github.com/seatgeek/fuzzywuzzy) लाइब्रेरी में' fuzz' और 'process' नामक मॉड्यूल आयात करने का प्रयास कर रहा हूं, '/ एप्लिकेशन/myapp/मॉड्यूल/पीजी 2.7 के साथ जीएई पर 'फ़ज़ीवाज़ी आयात फ़ज़, प्रक्रिया' से 'फ़ज़ीवाईज़ज़ी /' निर्देशिका का उपयोग करके, मुझे 'आयात' त्रुटि मिल रही है '<टाइप' अपवाद। आयात करें '> कोई मॉड्यूल फ़ज़ीवाईज़ज़ी नाम नहीं है – Sathvik

+0

मैंने इसे ' web2py/site-packages/fuzzywuzzy' और अब उन्हें आयात करने में सक्षम हूं :) ... लेकिन मुझे अभी भी 'web2py/एप्लिकेशन/myapp/मॉड्यूल /' निर्देशिका के भीतर मॉड्यूल रखने की संभावना में दिलचस्पी है, खासकर क्योंकि मैं नहीं करता जब मैं नए ऐप्स के लिए अपने मॉड्यूल को अपडेट करता हूं तो मैं अपने पुराने ऐप्स को गलती से तोड़ना नहीं चाहता हूं। – Sathvik

संबंधित मुद्दे