2011-11-08 14 views
5

मेरे पास एक ऐसी प्रोग्राम तैयार करने वाली स्क्रिप्ट्स की बढ़ती संख्या है जो मैं लिख रहा हूं और फैसला किया कि यह मेरे स्रोत पेड़ को साफ करने और उन्हें सही तरीके से पैकेज करने का समय था। मुझे यकीन है कि यह एक साधारण सवाल है लेकिन मुझे यह नहीं पता कि यह कैसे करना है।"मॉड्यूल के अंदर" पैकेज

यदि मेरे पास मॉड्यूल का समूह है, जो एक साथ फिट है, लेकिन एक शीर्ष-स्तरीय मॉड्यूल होना चाहिए और अन्य को मॉड्यूल नाम से पहले से जोड़ा जाना चाहिए लेकिन वास्तव में निम्न स्तर के पैकेज में जाना चाहिए, मैं इसे कैसे कर सकता हूं।

उदाहरण के लिए कहें कि मैं import mystuff पर सक्षम होना चाहता था, और सभी रहस्यों को प्राप्त करना चाहता था। लेकिन मुझे import mystuff.test.test1 में भी सक्षम होना चाहिए। मैंने सोचा था कि मैं इस तरह एक स्रोत पेड़ बन जाएगा,

myprogram/ 
    mystuff.py 
    mystuff/ 
     __init__.py 
     tests/ 
      __init__.py 
      test1.py 
      test2.py 
      ... 

लेकिन इस मामले में, यह mystuff/ (जब तक mystuff/ के __init__.py खाली है) लगता है हमेशा mystuff.py पर पूर्वता लेता है, तो import mystuff कुछ नहीं करता है।

वांछित व्यवहार प्राप्त करने के लिए सही दृष्टिकोण क्या होगा? या यह संभव नहीं है और मुझे mystuff.py को mystuff/ में ले जाना चाहिए और इसे mystuff.mystuff के रूप में एक्सेस करना होगा (प्रतीत होता है अनावश्यक पुनरावृत्ति की तरह)।

क्षमा करें, अगर मैंने अभी कुछ स्पष्ट याद किया है। मुझे लगता है कि इसे कहीं भी दस्तावेज किया जाना चाहिए, लेकिन मुझे लगता है कि कहीं कहीं नहीं है।

अद्यतन। जबकि मेरा मानना ​​है कि इग्नासिओ की विधि सही है, मुझे वास्तव में यह पसंद नहीं है! अगर मेरे पास मेरे संपादक में कई फाइलें खुलती हैं और उन्हें __init__.py कहा जाता है तो चीजें गन्दा हो सकती हैं। इसलिए, मैंने अपनी संरचना को छोड़ने का फैसला किया है, और mystuff.py से mystuff/__init__.py पर लिंक करें। अगर किसी के पास कोई राय है कि मुझे ऐसा क्यों नहीं करना चाहिए, तो मैं उन्हें सुनना चाहता हूं।

असल में अंत में, मैं दूसरी तरफ से जोड़ रहा हूं, क्योंकि tar.gz बनाते समय मुझे डिस्ट्यूल्स डीरेंसेंस सिम्लिंक बनाने का कोई तरीका नहीं मिला, और मैं अपने आउटपुट में टूटी हुई लिंक के साथ समाप्त हुआ। इस तरह का एक ही प्रभाव है और इसे खुश रखता है।

+0

हां। आपको ऐसा नहीं करना चाहिए क्योंकि इग्नाटियो की प्रतिक्रिया सही है। – cwallenpoole

+0

@cwallenpoole।सहमत हैं, लेकिन जिस दिन मैंने इसे सेटअप किया है, उसी समय * बिल्कुल * एक ही प्रभाव है। यहां तक ​​कि 'sdist' आउटपुट इग्नासिओ के समान ही होगा, मेरे लिंक के बिना। इसलिए विकास के दौरान यह मेरे लिए आसान बनाता है। क्या कोई और कारण है कि यह करना एक बुरी बात है? – tjm

उत्तर

4

mystuff.py में सब कुछ mystuff/__init__.py में रखा जाना चाहिए।

+0

मैंने इसके बारे में सोचा। लेकिन ऐसा करने के लिए यह एक बुरा तरीका लग रहा था। क्या यह अनुशंसित विधि है? यदि ऐसा है, तो मैं यही करूँगा, या यह सिर्फ "एक तरीका है जो काम करेगा"? आपके उत्तर के लिए धन्यवाद। – tjm

+0

इस तरह यह किया गया है। 'Foo/__ init __। Py' में कुछ भी आयात होने पर 'foo' का हिस्सा बन जाएगा। –

+0

ठीक है। तब यह बहुत अच्छा है। उस के रूप में आसान :) बहुत बहुत धन्यवाद। (अनुमति मिलने पर स्वीकार किया जाएगा) – tjm

4

आपके पास mystuff.py और mystuff/ पैकेज दोनों नहीं हो सकते हैं।

  • mystuff/__init__.py
  • में mystuff.py में कोड डाल नाम बदलने mystuff.py, उदाहरण के लिए, mystuff/_stuff.py, और उसके बाद के लिए आयात करने के लिए है कि mystuff/__init__.py में:

    आपके पास दो विकल्प।

    myprogram/ 
        mystuff.py ------- 
        mystuff/   \ 
         __init__.py /
         _stuff.py <--- 
         tests/ 
          __init__.py 
          test1.py 
          test2.py 
          ... 
    

    और mystuff/__init__.py की तरह दिखता है:

दूसरा विकल्प कुछ इस तरह दिखता

from mystuff._stuff import * 
संबंधित मुद्दे