2013-08-16 4 views
14

मेरे पास एक हैलो 1 पैकेज है जिसमें good.py मॉड्यूल है।क्या एक ही पैकेज में मॉड्यूल से __init__.py में चरों तक पहुंच बनाना संभव है?

hello1 
├── __init__.py 
└── good.py 

init मॉड्यूल एक चर A = 1 है, और मैं good.py. में चर hello1.A का उपयोग करने की जरूरत है

import hello1 

class Good(object): 
    def __init__(self): 
     print hello1.A 

if __name__ == "__main__": 
    g = Good() 

समस्या यह है कि जब मैं पायथन स्क्रिप्ट निष्पादित करता हूं तो मुझे ImportError: 'No module named hello1' त्रुटि मिली। मैं त्वरित समाधान के लिए good.py की पहली पंक्ति में import sys; sys.path.append("..") जोड़ सकता था।

हालांकि, good.py हैलो 1 पैकेज में है जहां __init__.py भी है, इसलिए मुझे आश्चर्य है कि एक ही पैकेज में मॉड्यूल से __init__.py में चरों तक पहुंचने का कोई तरीका है या नहीं।

+1

क्या आपने 'हैलो 1' वाली निर्देशिका में जाने और 'पायथन हैलो 1 \ good.py' के साथ स्क्रिप्ट चलाने की कोशिश की है?साथ ही, आपको यहां एक उत्तर मिल सकता है: http://stackoverflow.com/questions/436497/python-import-the-containing-package – flornquake

उत्तर

6

Python: import the containing package से:

आयात कर रहा है __init__ ठीक से काम करने लगता है।

import __init__ 

class Good(object): 
    def __init__(self): 
     print hello1.A 
+5

आपको सीधे '__init__' आयात नहीं करना चाहिए। इसके बजाय, 'हैलो 1' की मूल निर्देशिका को पायथन मॉड्यूल खोज पथ में सूचीबद्ध किया जाना चाहिए और इसके बजाय 'हैलो 1' आयात किया जाना चाहिए। –

+0

यदि आप इसके बजाय 'python -m hello1.good' का उपयोग करते हैं, तो वर्तमान कार्यशील निर्देशिका स्वचालित रूप से पथ में जोड़ दी जाती है; अगर वह 'हैलो 1' की मूल निर्देशिका है तो सबकुछ ठीक काम करता है। –

+0

@MartijnPieters, हमेशा नहीं। यदि आपके पास पैकेज के अंदर एक निष्पादन योग्य स्थित है, और कहें कि निष्पादन योग्य __init__.py में स्थित पैकेज के संस्करण संख्या को देखना चाहता है, तो यह वही है जो आपको करना चाहिए। – Cerin

0

आप sys.path.append (...) पसंद नहीं है आप या निर्देशिका "hello1" -directory युक्त के रूप में

python -m hello1.good 

अपनी स्क्रिप्ट चलाने सकता है बजाय PYTHONPATH वातावरण चर का उपयोग sys.path का।

1

मैं गलत नहीं कर रहा हूँ, तो आप की तरह कुछ करना चाहता हूँ:

python hello1/good.py 

good.py के बाद से एक पैकेज आप shouldn का एक submodule है, 'टी यह सीधे चलाने; ध्यान रखें कि जब इसे सीधे निष्पादित किया जाता है, तो इसे hello1 पैकेज के हिस्से के रूप में नहीं माना जाता है, जो सापेक्ष आयात को रोकता है और वर्तमान निर्देशिका वह फ़ाइल है जिसमें फ़ाइल है, इसलिए hello1 यह नहीं पाया जा सकता है कि यह हिस्सा नहीं है PYTHONPATH

-m mod: इसके बजाय आप अजगर दुभाषिया की -m स्विच का उपयोग चला सकते हैं एक स्क्रिप्ट के रूप में पुस्तकालय मॉड्यूल चलाने (विकल्प सूची समाप्त हो जाता है)

मैं व्यक्तिगत रूप से करने के लिए दुभाषिया विकल्पों का उपयोग कर पसंद नहीं है एक पायथन फ़ाइल निष्पादित करें। मेरे पास एक स्वतंत्र लॉन्चर फ़ाइल good.py है जो hello1.good मॉड्यूल आयात करती है और इसे करने के लिए इसका उपयोग करती है।

0

आपको उन स्थिरांकों को स्पष्ट रूप से आयात करना होगा जिन्हें आप उपयोग करना चाहते हैं।

यह आपके सभी स्थिरांक को "कॉन्फ़िगरेशन" फ़ाइल (यानी config.py) में रखना बेहतर है) और फिर यदि आप उन्हें पैकेज नामस्थान में चाहते हैं, तो उन्हें आयात करें।

init .py फ़ाइल:

from package.config import * 

यह और अधिक स्पष्ट है कि जिस तरह से

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