2010-04-26 4 views
21

मैंने डिफ़ॉल्ट टेम्पलेट के आधार पर एक साधारण GAE ऐप बनाया है। मैं short_url जैसे बाहरी मॉड्यूल को जोड़ना चाहता हूं। मैं यह कैसे करु? जिन निर्देशों को मैंने अभी तक पाया है वे उलझन में हैं और जीएई मुझे लगता है कि स्पष्ट कारणों से पायथनपैथ का उपयोग नहीं कर रहा है।Google App Engine में मॉड्यूल कैसे आयात करें?

उत्तर

30

बस अपनी ऐप की निर्देशिका में short_url.py फ़ाइल डालें।

नमूना App इंजन परियोजना:

 
myapp/ 
    app.yaml 
    index.yaml 
    main.py 
    short_url.py 
    views.py 

और views.py (या जहाँ भी) में, आप तो इतनी तरह आयात कर सकते हैं:

import short_url 

अधिक जटिल परियोजनाओं, शायद एक बेहतर तरीका के लिए विशेष रूप से निर्भरताओं के लिए एक निर्देशिका बनाना है; कहते हैं कि lib:

 
myapp/ 
    lib/ 
     __init__.py 
     short_url.py 
    app.yaml 
    index.yaml 
    main.py 
    views.py 
from lib import short_url 

# 2 संपादित करें:
क्षमा याचना, मैं इस पहले उल्लेख किया जाना चाहिए था। निम्नलिखित फिक्स के लिए निक जॉनसन के लिए धन्यवाद, आपको अपना रास्ता संशोधित करने की आवश्यकता है।
सुनिश्चित करें कि यह कोड आपके ऐप को शुरू करने से पहले चलाया गया है; कुछ इस तरह:

import os 
import sys 

def fix_path(): 
    # credit: Nick Johnson of Google 
    sys.path.append(os.path.join(os.path.dirname(__file__), 'lib')) 

def main(): 
    url_map = [ ('/', views.IndexHandler),] # etc. 
    app = webapp.WSGIApplication(url_map, debug=False) 
    wsgiref.handlers.CGIHandler().run(app) 

if __name__ == "__main__": 
    fix_path() 
    main() 

Edit3:
सभी अन्य आयात से पहले चलाने के लिए इस कोड को पाने के लिए आपको (पथ को अपने ऐप्लिकेशन के आधार निर्देशिका में अपने आप में एक फ़ाइल में कोड के प्रबंधन के रख सकते हैं अजगर को पहचानता है बिना किसी पथ संशोधन के उस निर्देशिका में सबकुछ)।
और फिर आप सिर्फ यह सुनिश्चित होता है कि इस आयात

import fix_path 

... अपने main.py फ़ाइल में अन्य सभी आयातों से पहले सूचीबद्ध है।
मेरी स्पष्टीकरण स्पष्ट नहीं होने पर यहां link to full, working example है।

+0

मुझे अभी भी कोई समस्या हो रही है, भले ही मैं इस लेआउट के साथ ऐप सर्वर को पुनरारंभ करता हूं। lib आयात से short_url आयात त्रुटि: कोई मॉड्यूल नाम –

+0

धन्यवाद - यह अब काम कर रहा है। Fix_path() को कॉल करने के लिए सबसे अच्छी जगह कहां है? मैं इसे इस तरह से फोन कर रहा हूँ: अगर __name__ == '__main__': fix_path() मुख्य() और फिर मैं इस समारोह मेरी कोड से कहा जाता है: डीईएफ़ generate_key (आईडी): आयात SHORT_URL वापसी short_url।encode_url (id) क्या कहीं कहीं मैं fix_path() कह सकता हूं कि क्या आप फ़ाइल के शीर्ष पर सभी आयात एक साथ रख सकते हैं? –

+0

@ ब्रायन: बढ़िया। मैं खुश हूं कि आपका यह चलने लगा। मैं आपको एक स्थान पर आयात रखने की अनुमति देने के लिए एक और उदाहरण जोड़ूंगा। – bernie

0

चूंकि उस यूआरएल_शॉर्टनर प्रोग्राम पायथन में लिखा गया है, तो आप बस अपने स्रोत कोड में शामिल कर सकते हैं और इसे अन्य पायथन मॉड्यूल की तरह आयात कर सकते हैं।

5

मैं @ एडम बर्नियर और @ एसमार्क द्वारा दिए गए उत्तरों को दूसरा दूंगा, हालांकि अदम की व्याख्या है कि चीजें थोड़ा अधिक विस्तार से हैं। आम तौर पर, आप अपनी ऐप इंजन निर्देशिका में कोई शुद्ध पायथन मॉड्यूल/पैकेज जोड़ सकते हैं और जब तक वे सैंडबॉक्स के बाहर काम करने की कोशिश नहीं करते हैं, यानी, फाइलें नहीं बना सकते हैं, नेटवर्क सॉकेट नहीं खोल सकते हैं, आदि। ।

  • फ़ाइलें (अनुप्रयोग फ़ाइलें और स्थिर फ़ाइलें) की अधिकतम कुल संख्या:

    भी कठिन सीमा को ध्यान में रखना 3,000

  • एक आवेदन फ़ाइल का अधिकतम आकार: 10 मेगाबाइट
  • का अधिकतम आकार स्थिर फ़ाइल: 10 मेगाबाइट
  • सभी आवेदन और स्थिर फ़ाइलों की अधिकतम कुल आकार: 150 मेगाबाइट

अद्यतन (अक्टूबर 2011): इन नंबरों have been increased करने का सबसे:

  • फ़ाइलें (अनुप्रयोग फ़ाइलें और स्थिर फ़ाइलें) की अधिकतम कुल संख्या: 10,000
  • एक आवेदन फ़ाइल का अधिकतम आकार: 32MB
  • का अधिकतम आकार स्थिर फ़ाइल: 32MB

अद्यतन (जून 2012): पिछले सीमा was bumped up रहे हैं:

  • सभी एप्लिकेशन और स्थिर फाइलों का अधिकतम कुल आकार: 1 जीबी
1

आप पिन के रूप में पाइथन पैकेज आयात कर सकते हैं। यह आपको अधिकतम फ़ाइल गिनती से बचने की अनुमति देता है।

app engine docs इसे संबोधित करें।

python 2.5: zipimport is supported.

python 2.7: zipimport is not supported, but Python 2.7 can natively import from .zip files.

इस प्रकार मैं बोटो आयात करता हूं।

sys.path.insert(0, 'boto.zip') 
import boto #pylint: disable=F0401 
from boto import connect_fps #pylint: disable=F0401 

इस तकनीक के विपक्ष में कई पैकेजों को मैन्युअल रूप से पुन: संग्रहित करना शामिल है।

उदाहरण के लिए, boto.zip इसके अंदर "बोटो" मॉड्यूल (अन्य उपनिर्देशिका) के साथ "बोटो" उपनिर्देशिका में डिकंप्रेस करता है।

तो स्वाभाविक रूप से बोटो आयात करने के लिए आपको बोटो आयात बोटो से करना पड़ सकता है, लेकिन इससे __init__.py की कमी के साथ अजीबता हो सकती है।

इस का समाधान करने के लिए बस को संपीड़ित, और मैन्युअल रूप से Boto सबफ़ोल्डर को संग्रहीत boto.zip के रूप में, और अपने आवेदन फ़ोल्डर में रखें कि।