2009-10-18 7 views
7

मैंने हाल ही में पाइथन 3.1 पर चलाने के लिए अपनी पायथन परियोजना को पोर्ट किया है। इसके लिए मुझे अपने प्रोजेक्ट के सबमिड्यूल और उप-पैकेजों के भीतर सापेक्ष आयात की नीति अपनाना पड़ा। मैंने ऐसा नहीं किया है और अब परियोजना स्वयं काम करती है, लेकिन मैंने देखा कि मैं इसमें से किसी भी उप-पैकेज या सबोड्यूल को निष्पादित नहीं कर सकता। अगर मैं कोशिश करता हूं, तो मुझे "buildins.ValueError: गैर-पैकेज में सापेक्ष आयात का प्रयास किया गया"। मैं केवल पूरी परियोजना आयात कर सकता हूं।पायथन: सापेक्ष आयात का मतलब है कि आप स्वयं द्वारा एक उप-पैकेज निष्पादित नहीं कर सकते हैं?

क्या यह सामान्य है?

उत्तर

3
में

आप उप-पैकेज (या 3.1 में संकुल) में मॉड्यूल चलाने के लिए पायथन दुभाषिया के ध्वज का उपयोग कर सकते हैं।

+0

मैं कहूंगा कि आपको * -एम' स्विच का उपयोग करना है; ऐसा नहीं है कि आप * कर सकते हैं। मुझे सीधे पाइथन फाइलों को कॉल करना पसंद है, क्योंकि मुझे स्विच को याद रखने की आवश्यकता नहीं है और मेरा खोल अच्छी तरह से ऑटो पूर्ण हो जाता है। –

+0

इस उत्तर को देखें कि क्या आप एक सबमिशन से निष्पादन योग्य पायथन स्क्रिप्ट चलाने में रूचि रखते हैं: http://stackoverflow.com/a/11537218/730150 – krumpelstiltskin

4

हाँ, यह सामान्य है। यदि आप एक मॉड्यूल निष्पादित करना चाहते हैं जो पैकेज का एक हिस्सा भी है (स्वयं में एक अजीब चीज है) तो आपको पूर्ण आयात करने की आवश्यकता है। जब आप मॉड्यूल निष्पादित करते हैं तो यह नहीं है, दुभाषियों के दृष्टिकोण से, पैकेज का एक हिस्सा है, लेकिन __main__ मॉड्यूल। तो यह नहीं पता होगा कि रिश्तेदार पैकेज कहां हैं। के रूप में इस मॉड्यूल के बाहर निष्पादन स्क्रिप्ट डाल करने के लिए सक्षम बनाता है, उदाहरण के लिए

यह करने के लिए मानक तरीका, संकुल, और अलग निष्पादन स्क्रिप्ट कार्यों फोन में कार्य करने के लिए है/usr/bin

+1

वाह, मैं इस दर्शन अजीब लगता है। उदाहरण के लिए, मेरे पास मेरे प्रोजेक्ट में पैकेज 'लाइफ' है। इसका पूर्ण पथ 'garlicsim.bundled.simulation_packages.life' है। मैं इसे अपने आप चलाने में सक्षम होना पसंद करता था, क्योंकि यह 'garlicsim' में किसी भी चीज़ पर निर्भर नहीं है। मैं इसे खुद से चलाने में सक्षम क्यों नहीं होना चाहिए? –

+0

1. यदि यह garlicsim में किसी भी चीज़ पर निर्भर नहीं है, तो यह garlicsim में क्यों है? 2. आप इसे अपने आप क्यों नहीं चला पाएंगे? आप इसे अपने आप से चला सकते हैं, लेकिन आपको पूर्ण आयात करने की आवश्यकता है, जो 'garlicsim.bundled.simulation_packages.life आयात से' है। 3. दर्शन क्या है जो आपको अजीब लगता है? मैंने किसी भी दार्शनिक का जिक्र नहीं किया, इसलिए मुझे नहीं पता कि "यह" दर्शन क्या है। –

+3

1. यह सिर्फ बंडल में है। लेकिन मैं 'garlicsim.asynchronous_crunching.crunchers' का एक और उदाहरण ले सकता हूं, जो एक उप-पैकेज है जो garlicsim पर निर्भर है, लेकिन यह garlicsim पर निर्भर नहीं है। (2) कहें कि क्या मैं इसे किसी अन्य पैकेज में किसी दिन ले जाना चाहता हूं, मैं आयात लाइनों को संपादित करने के झगड़े के बिना क्यों नहीं कर सकता? (3) शायद मुझे "दर्शन" के बजाय "नीति" कहा जाना चाहिए था। यह रवैया, या तो (ए) पैकेज को स्वतंत्र रूप से निष्पादित करने में सक्षम होने के कारण, या (बी) इसे अन्य पैकेजों में आसानी से पोर्ट करें, लेकिन दोनों नहीं। –

-1

मेरे पास same problem था और मैंने -m स्विच बहुत कठिन माना।

इसके बजाय मैं इस का उपयोग करें:

try: 
    from . import bar 
except ValueError: 
    import bar 

if __name__ == "__main__": 
    pass 
+0

लागू सापेक्ष आयात को हटाया गया है और पायथन 2.7 में हटा दिया गया है। – habnabit

+0

अरोन, आप सही हैं लेकिन मुझे नहीं लगता कि यह मेरा समाधान कैसे बदलता है। यह किसी भी पायथन 2.5-3.1 के साथ काम करता है। – sorin

+0

नहीं, यह 3.x में काम नहीं करता है। इसे 2.7+ में हटा दिया गया है, जिसमें 3.0-3.1 शामिल है। – habnabit

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

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