2012-04-21 2 views
5

मैं एक पैकेज लिखता हूं पी। पी की जड़ पर एक मॉड्यूल m0 है।उसी पैकेज में किसी अन्य मॉड्यूल से पैकेज पदानुक्रम की जड़ पर पायथन मॉड्यूल आयात करने का सबसे अच्छा तरीका

from P.m0 import ... 
हालांकि

अगर मैं पीआई का नाम बदलने: कहीं पी अंदर वहाँ मॉड्यूल एम 1, एम 2, ... एम 0 से आयात करने के लिए है कि जरूरत

पाठ्यक्रम मैं इन मॉड्यूल में से प्रत्येक में लिख सकते हैं के

हैं सभी स्थानों पर फिर से जाना और ऐसे बयान दोबारा लिखना है।

मैं सापेक्ष आयात का भी उपयोग कर सकता हूं लेकिन यदि मैं पैकेज पदानुक्रम में एक अलग स्तर पर एक मॉड्यूल ले जाता हूं तो मुझे बिंदुओं की संख्या को ठीक करना होगा।

कुछ अन्य कारण भी हैं, लेकिन नीचे की रेखा, मैं वास्तव में मॉड्यूल एम 0 से आयात करना चाहता हूं जो मेरे पैकेज की जड़ पर स्थित है, इसे व्यक्त करने का सबसे अच्छा तरीका क्या है?

+0

लेखन का लघु एक बहुत ही अंतरंग हैक जैसे 'आयात x' जो 'sys को बदलता है।पथ ', या' बिल्टिन .__ import__' के अर्थशास्त्र को ओवरराइड करना या http://docs.python.org/library/functions.html#__import__ में सुझाए गए आयात हुक बनाना, आप एक बहुत ही उचित सुविधा की तलाश में हैं जो मौजूद नहीं है ज्यादातर भाषाओं में मुझे 2012 के बारे में पता है। मेरी विनम्र राय में, अजगर कुछ अन्य भाषाओं की तुलना में बेहतर अनुकूल है, लेकिन फिर भी विशेष रूप से गैर-वर्बोज़ आयात के लिए उपयुक्त है। "पायथनिक" यह देखते हैं कि इस तरह की क्रियाशक्ति स्पष्ट है, और इसलिए अच्छा है, शायद यह सुविधा आगामी नहीं होगी। – ninjagecko

+0

मुझे पता था कि मुझे इसके बारे में बड़ा सौदा मिल जाएगा, आप वैसे भी प्रमुख रिफैक्टरिंग कर रहे हैं। लेखन कोड हर समय प्रमुख refactoring है। आप कई पैकेजों के साथ काम करते हैं, आप एक ही स्थान पर कुछ डालते हैं, फिर आप महसूस करते हैं कि यह बड़ी कार्यक्षमता है जिसका उपयोग कहीं और किया जा सकता है, इसलिए आप इसे किसी अन्य पैकेज में दोबारा प्रतिक्रिया देते हैं। ऐसी चीजें हैं जिन पर आपको चिंता करने की ज़रूरत है जब आप चीजों को चारों ओर ले जाते हैं तो मैं ओवरहेड को कम करने की कोशिश कर रहा हूं। वैसे, मेरे पास प्रत्येक पैकेज के शीर्ष पर एक एम 0 है, इसलिए जब कोई मॉड्यूल किसी अन्य पैकेज पर जाता है और फिर भी पहले पैकेज के शीर्ष पर m0 को संदर्भित करता है, तो त्रुटि प्रवण होती है। – gae123

+0

हां, मैं सहमत हूं। फिर भी मुझे यकीन नहीं है कि आप क्या कह रहे हैं कि आप क्या कह रहे हैं। मैं नहीं पूछ रहा था "इस बारे में बड़ा सौदा क्या है"। – ninjagecko

उत्तर

1

यह संभव नहीं है।

हालांकि, यदि आप प्रमुख रिफैक्टरिंग करते हैं तो आप कुछ रिश्तेदार आयातों को अपडेट करने वाले उप-पैकेजों के बीच मॉड्यूल के चारों ओर स्थानांतरित करते हैं, यह एक बड़ी समस्या नहीं है।

यदि आप सापेक्ष आयात का उपयोग नहीं करते हैं तो शीर्ष-स्तरीय पैकेज नाम का नाम बदलने के लिए भी लागू होता है - जो आपकी सभी फ़ाइलों पर खोज-और-प्रतिस्थापन के साथ भी वास्तव में तेज़ किया जा सकता है।

+0

सहमत - एक आयात केस को ठीक करने के लिए अतिरिक्त जादू जोड़ने के बिना 'आयात' पर्याप्त जटिल है जिसे त्वरित खोज-और-प्रतिस्थापन द्वारा नियंत्रित किया जा सकता है। – katrielalex

0

यदि आप अपने प्रश्न को एक छोटा सा संशोधित करने के इच्छुक हैं, तो आप इससे दूर हो सकते हैं।

यदि आपके पैकेज में केवल प्रवेश बिंदु नियंत्रित हैं; जैसे आप केवल testsuite package/.../module.py लागू की तरह कुछ

तो आप यह सुनिश्चित करें कि सबसे पहले आपको import firstthing है बना सकते हैं होगा जो कार्य करके अपने कोड का परीक्षण, और पैकेज में/firstthing.py आपके पास:

import sys 
import os.path 
packageDir = os.path.split(__name__)[0] 
sys.path[:] = sys.path+[packageDir] # or maybe you want it first... 

मुख्य चेतावनी यह है कि आप अपने एंट्री पॉइंट्स के बिना बिना पाइथन फाइलों को चलाने में सक्षम नहीं होंगे। मैं हमेशा पाइथन में लिखने वाली हर परियोजना के लिए ऐसा करना चाहता हूं (रिश्तेदार आयात अच्छी तरह से काम करने के लिए), लेकिन मुझे व्यक्तिगत रूप से यह इतना असुविधाजनक लगता है कि मैं अभी हार मानता हूं।


दूसरा विकल्प भी है। यह नहीं है यह निर्दिष्ट करने के लिए अनुचित है कि आपके पैकेज को पायथन पथ में एक और पैकेज की आवश्यकता है। यह पैकेज एक उपयोगिता पैकेज हो सकता है जो एक प्रमुख हैक करता है। उदाहरण के लिए यदि पैकेज का नाम "x" था, तो आप import x कर सकते हैं जो दुभाषिया स्टैक पर प्रतिबिंब करने के लिए निरीक्षण मॉड्यूल का उपयोग करेगा, जिससे आप यह पता लगा सकें कि आप किस मॉड्यूल से इसे आयात कर रहे थे। तब तक जब तक आपको अपने पैकेज की जड़ नहीं मिलती है (कुछ विशेष संकेतक फ़ाइल, या मैनिफेस्ट, या कुछ की जांच करके) आप पैरेंट निर्देशिकाओं तक जाकर "पिछड़ा os.walk" कर सकते हैं। फिर कोड sys.path के माध्यम से पाइथन पथ के उपर्युक्त संशोधन को प्रोग्रामेटिक रूप से निष्पादित करेगा। यह उपर्युक्त जैसा ही है, लेकिन आपके पास एक भयानक प्रविष्टि के माध्यम से बिना किसी पाइथन फ़ाइल चलाने जैसी चीजों को करने की स्वतंत्रता है।

यदि आपके पास शैल पर्यावरण पर अत्यधिक नियंत्रण है, तो आप अपनी पैकेज निर्देशिका को शामिल करने के लिए $ PYTHONPATH को भी बढ़ा सकते हैं, लेकिन यह कई तरीकों से बेहद नाजुक है, और बल्कि सुरुचिपूर्ण है।